Avatar billede Swift Praktikant
11. maj 2005 - 15:14 Der er 7 kommentarer og
2 løsninger

Problemer med datetime felt (smalldatetime)

Jeg er ved at flytte en database fra én server, til en anden.

På serveren som jeg overfører TIL synes jeg 'smalldatetime' felterne er blevet sære!
Formater ser således ud, hvis jeg bruger Query Analyzeren:
2004-09-30 00:00:00
Altså er datoformatet: YYYY-MM-DD

Kan der være en eller anden indstilling på serveren der afgør hvordan formatet skal være.

Jeg har noget asp kode der laver en SELECT hvor der søges efter datoer med dette format: DD-MM-YYYY.
asp kodne kan godt køre på den "gamle" server, men ikke på den nye - fordi datoformatet nu tilsyneladende er forkert.
Avatar billede misbruger Nybegynder
11. maj 2005 - 16:04 #1
Når du installere MS SQL kan du vælge hvilken collation den benytter.
Det kan du også ved oprettelse af en enkelt database.

Collation er lidt ligesom regional settings!
Avatar billede janus_007 Nybegynder
11. maj 2005 - 21:29 #2
ja og nej.. formattet DD-MM-YYYY er ikke videre smart at bruge. Du kan eks.vis ikke sortere på det... det kan du på YYYY-MM-DD

Og du kan altid bruge (i mine øjne et korrekt) datoformat igennem din ASP - her skal du huske at starte dine sider med session.lcid sådan at du ikke sidder og koder op imod serverens indstillinger. Hvis du ikke bruger LCID vil du hurtigt alligevel komme ud for problemer, eks.vis hvis regional settings på webserveren ændres - det kunne ske ved en reinstallation.
Grunden til at du oplever det du gør er pga. IIS's regional settings og har altså heller intet at gøre med Regional Settings på serveren. Hvis du vil ændre det efter IIS installationen skal det gøres igennem din registry - søg evt. på Google, mange sidder med dateformat iis probs ligesom dig.

Men drop alt det fis....
Derfor vil jeg anbefale at gå over til som sagt LCID og bruge det mere generelle datoformat.
Udover det.. som så mange herinde nævner og tror, så vil jeg altså gerne lige skære ud i pap at datoformatet på sqlserveren ikke ændres vha. collation. Den eneste måde du kan ændre det på er vha. SET DATEFORMAT ved hver forespørgsel!!
Avatar billede Swift Praktikant
12. maj 2005 - 10:59 #3
Janus_007:
Nu er problemet bare at jeg har en MASSE .asp kode der skal flyttes fra én server til en anden server. Og jeg vil helst bare løse problemet i registreringsdatabasen - hvis det kan lade sig gøre.

Jeg har søgt lidt efter det med registreringsdatabasen, men jeg har ikke funget nålen endnu...
Alle steder i min registreringsdabase er formatet for sShortDate = dd-MM-yyyy, hvilket jo burde være ok - og BURDE give det rigtige resultat - men det gør det ikke...
Avatar billede Swift Praktikant
12. maj 2005 - 11:04 #4
Helt konkret(fra .asp koden):

idag = day(date()) & "-" & month(date()) & "-" & year(date())
SELECT * FROM tabel1 WHERE dato = '"&idag&"'

Det bliver til: SELECT * FROM tabel1 WHERE dato = '12-05-2005'
Men det matches IKKE, for tabel1.dato indeholder/returnerer '2005-05-12 00:00:00'
Avatar billede janus_007 Nybegynder
12. maj 2005 - 13:06 #5
Men hvad så med bare at bytte om på idag ??

idag = year(date()) & "-" & month(date()) & "-" & day(date())
SELECT * FROM tabel1 WHERE dato = '"&idag&"'

Det bliver til: SELECT * FROM tabel1 WHERE dato = '2005-05-12'

En anden ting du kunne gøre var eks.vis at bruge SET DATEFORMAT, altså noget i retning af:

SET DATEFORMAT ymd; SELECT * FROM tabel1 WHERE dato = '12-05-2005'

Eller evt. denne her (som jeg ikke mener er videre performancegod)

SELECT * FROM tabel1 WHERE convert(varchar, dato, 105) = '12-05-2005'
, men hvis du bare skal have flyttet lidt data eller det er meget begrænset anvendelse så pyt da :O)
Avatar billede Swift Praktikant
12. maj 2005 - 13:38 #6
Janus 007:
Hæh, hvor skægt...jeg havde også overvejet ændringen af 'idag' og 'convert' metoderne.

Men jeg havde nu håbet på at det kunne løses UDEN at skulle pille i alle .asp filerne.
Nuvel, det må man jo nok blot acceptere...
Avatar billede janus_007 Nybegynder
12. maj 2005 - 20:25 #7
Det kan desværre ikke lade sig gøre, og jeg vil råde dig til altid at udvikle op imod ansi standarder og ikke noget dansk/ norsk/ svensk snask.. Det kan hurtigt give problemer :O)
Avatar billede ldanielsen Nybegynder
13. maj 2005 - 15:24 #8
janus_007 > Hvad mener du med ast man ikke kan sortere på datetime hvis formatet er ... 

ORDER BY dtmDato giver altid korrekt rækkefølge, uanset hvad.

swift >
Det du skulle have gjort, og måske kan gøre nu, er at lave en funktion der konverterer en dato til en streng. Læg den i en fil som du includer på de sider du skal bruge den, og derefter skal du kun rette det ét sted, hvis det skulle ske igen.

Function ConvertDateToSqlString(dtmDateInput)
  ConvertDateToSqlString = year(dtmDateInput()) & "-" & month(dtmDateInput()) & "-" & day(dtmDateInput())
End Function

- eller hverdan du nu vil have det.

Bruges sådan:

strSQL = "SELECT * FROM tabel1 WHERE dato = '" & ConvertDateToSqlString(Date()) & "'"
Avatar billede janus_007 Nybegynder
14. maj 2005 - 20:00 #9
ldanielsen-> Du kan naturligvis sortere på sqlserveren, hvis du nu ellers tog og læse det jeg havde skrevet så ville det også være klart for dig i i og med jeg flere gange nævner at collation ikke påvirker dateformatet på sqlserveren.

Udover det så har den funktion jo slet ikke noget med sagen at gøre, det er jo slet ikke problemet... hvilket også burde være klart hvis du ellers læste hele tråden. Om det skrives direkte eller kaldes vha. en funktion er ret ligegyldigt i den her situation.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester