Avatar billede frank_jensen Nybegynder
29. september 2001 - 17:31 Der er 34 kommentarer og
2 løsninger

Datoforvirring i stor stil...

Heg har en database, der indeholder en række datoer, som skal kunne redigeres gennem en ASP-side...

Øverst på mine sider står der Session.LCID = 1030, hvilket gerne skulle give danske indstillinger...  Når jeg læser datoerne, bruger jeg Format$([Dato],\'dd-mm-yyyy\') AS VisDato, der giver det rigtige visningsformat...

Men, når jeg gemmer en dato, f.eks. 11-10-2001, bliver den gemt i databasen som 10-11-2001, mens f.eks. 18-10-2001 bliver gemt som 18-10-2001...

Det vil sige, hvis datoen for dagen er mindre end 13, bliver der byttet om på dag og måned...

Hvad kan jeg gøre for at løse det ???

Ved aner ikke, om serverens indstillinger er engelske eller danske...
Databasen er en Access 2000, dansk version.
Avatar billede torbenmelander Nybegynder
29. september 2001 - 17:34 #1
brug # rundt om datoen
Avatar billede torbenmelander Nybegynder
29. september 2001 - 17:36 #2
din sql kunne se sådan her ud:

INSERT INTO Persons (Dato, Title)
VALUES (#10-11-2001#, \'Din Title\')
Avatar billede frank_jensen Nybegynder
29. september 2001 - 17:37 #3
Jeg har allerede ## rundt om datoen...

SQL = \"INSERT INTO Kalender (ID, Dato, Titel)\"
SQL = SQL & \"SELECT \" &ID &\", #\" & Dato & \"#, \'\" & Titel & \"\'\"
Avatar billede torbenmelander Nybegynder
29. september 2001 - 17:40 #4
okay, prøv at kigge på opsætningen på feltet i databasen (i access) .. det hedder noget med format ..
Avatar billede frank_jensen Nybegynder
29. september 2001 - 17:43 #5
kort datoformat...
Avatar billede a1a1 Novice
29. september 2001 - 17:46 #6
Hvis du formaterer dine datoer i US format vil der ikke være nogle problemer.
ex. 2001-12-30 (åååå-mm-dd)
Avatar billede frank_jensen Nybegynder
29. september 2001 - 17:50 #7
hvordan kan jeg gennemtvinge, at jeg vil gemme i US formatet ? Det skal kunne gøres fra siderne, da jeg ikke har adgang til rettighederne på serveren...
Avatar billede keysersoze Ekspert
29. september 2001 - 17:51 #8
det som jeg plejer at gøre er, at lade access indsætte datoen og ikke din egen sql - dette er meget lettere og resultatet bliver det samme....

jeg kan ikke huske hvad standardværdien i access skal sættes til, men mener det er noget hen af:

NOW()

eller

DATE()
Avatar billede frank_jensen Nybegynder
29. september 2001 - 17:53 #9
En date() giver datoen som 11-10-2001, men den bliver gemt som 10-11-2001 i databasen...

dvs. at Access og NT ikke er specielt enige om datoformatet...
Avatar billede keysersoze Ekspert
29. september 2001 - 18:01 #10
men vha Session.LCID = 1030 som der jo står i toppen vil udtrækket blive som øsnket...
Avatar billede frank_jensen Nybegynder
29. september 2001 - 18:02 #11
siderne og databasen ligger endvidere på samme server...

så jeg fatter ikke, hvad der er galt...
Avatar billede a1a1 Novice
29. september 2001 - 18:02 #12
Når du gemmer dato en selvfølgelig. Datoen bliver vist som specificeret under regional options (set default system locale), eller hvis du specificerer session.LCID (det kræver dog at serveren genkender den specificerede LCID hvilket ikke er sikkert hvis det er en amerikansk server.

Du kan evt. selv formatere dine datoer
dag = day(oRs(\"dato\"))
md = month(oRs(\"dato\"))
aar = year(oRs(\"dato\"))
ledato = dag & \"-\" & md & \"-\" & aar
Avatar billede frank_jensen Nybegynder
29. september 2001 - 18:10 #13
Problemet er ikke en visningen overhovedet, men at den gemmer forkert...

F.eks :
SQL = \"INSERT INTO Kalender (ID, Dato, Titel)\"
SQL = SQL & \"SELECT 1, #11-10-2001#, \'Titel1\'\"

giver datoen 10 november 2001

og
SQL = \"INSERT INTO Kalender (ID, Dato, Titel)\"
SQL = SQL & \"SELECT 2, #13-10-2001#, \'Titel2\'\"

giver datoen 13 oktober 2001

???
Avatar billede a1a1 Novice
29. september 2001 - 18:10 #14
eller hvis dato skal i db
ledato = aar & \"-\" & md & \"-\" & dag
Avatar billede a1a1 Novice
29. september 2001 - 18:12 #15
hvis du gemmer i US format vil det virke (åååå-mm-dd)
databasen vil se at året kommer først og derfor ilægge den rigtigt :)
Avatar billede keysersoze Ekspert
29. september 2001 - 18:12 #16
frank_jensen >> når du så hiver datoen ud af databasen (og du har Session.LCID = 1030 i toppen) hvordan bliver udtrækket så? som ønsket eller som det står i databasen?
Avatar billede a1a1 Novice
29. september 2001 - 18:14 #17
det skyldes velsagtens at SQL er amerikansk og de siger (og skriver) måned først ie. september 11. :)
Avatar billede frank_jensen Nybegynder
29. september 2001 - 18:15 #18
Hvis jeg har gemt 11-10-2001, bliver det vist som 10-11-2001 (og det står der også, hvis jeg åbner tabellen)...

a1-> jeg har prøvet at hardcode datoen ind, så det bliver i US format, og det virker faktisk... 

Men vil det altid virke ?
Avatar billede frank_jensen Nybegynder
29. september 2001 - 18:19 #19
og hvordan kan jeg vende datoen i VBScript ? (Altså hvilken funktion skal jeg bruge, hvis jeg vil tage den del af en tekststreg ud, f.eks. tegn 6 og 7 ?)
Altså kunne jeg godt tænke mig at se en funktion, der kan vende en tekststreg fra dansk datoformat til US datoformat...  :o)
Avatar billede keysersoze Ekspert
29. september 2001 - 18:28 #20
du skriver:

\"Det vil sige, hvis datoen for dagen er mindre end 13, bliver der byttet om på dag og måned...\"

vil det sige, at ved de dage der er større end 13 bliver der IKKE byttet om?

når du indsætter datoen på den måde du gør styrer access selv at det rigtige bliver sat ind og derfor _burde_ den altså ikke gøre noget sådant... det burde være nok at have din landekoden i toppen og udskrive datoen ved:

Response.Write \"\" & rs(\"dato\") & \"\"



Avatar billede frank_jensen Nybegynder
29. september 2001 - 18:29 #21
keysersoze-> den bytter kun om, hvis dagen er mindre end 13...  det var det, der gav mig grå hår i hovedet...

ER ved at lave et test-script, så i kan se hvad jeg mener...
Avatar billede frank_jensen Nybegynder
29. september 2001 - 18:51 #22
Og nu kan I selv undre Jer over, hvorfor...

\"Gode\" testdatoer er 11-10-2001(Bliver ikke gemt ok) og 13-10-2001(Bliver gemt OK)...

http://www.ravnenet.dk/Dato.asp

Koden til at gemme ser sådan ud :
    DatoDB.Execute(\"DELETE * FROM Dato\")   

    Dato        = Replace(Request.Form(\"Dato\"), \"\'\", \"\'\'\")

    rESPONSE.WRITE(\"<BR>Dato der er indtastet : \" & Dato)


    SQL = \"INSERT INTO Dato (Dato)\"
    SQL = SQL & \"SELECT #\" &Dato &\"#\"
    Response.write(\"<BR>SQL-Sætning : \" & SQL)
    DatoDB.Execute(SQL)


    SQL = \"SELECT Format$([Dato],\'dd-mm-yyyy\') as VisDato FROM Dato\"
    DatoRS = DatoDB.Execute(SQL)

    strDato = DatoRS(\"VisDato\")

    Response.write(\"<BR>Datoen \"&strDato &\" er aflæst i db\")
Avatar billede keysersoze Ekspert
29. september 2001 - 18:56 #23
hvis du henter databasen fra serveren - ser resultatet så ud som det er tastet ind eller som det bliver hentet ud?
Avatar billede frank_jensen Nybegynder
29. september 2001 - 19:00 #24
i databasen vil der står (ved datoen 10 november 2001) 10-11-01, altså ikke med 4 cifferet årstal...

Men den \"vender\" dag og måned om hvis dagen er mindre end 13...
Avatar billede keysersoze Ekspert
29. september 2001 - 19:04 #25
\"vil der stå\" jeg spurgte nu ikke om hvad der \"ville\" stå - men om hvad der virkelig stod...

og er der en grund til at du bruger \"Format$([Dato],\'dd-mm-yyyy\') as VisDato\" hvis du nu også havde din Session.LCID = 1030 i toppen?
Avatar billede a1a1 Novice
29. september 2001 - 19:05 #26
Ja det virker altid; jeg har ikke været ude for at det ikke virkede :)
Avatar billede frank_jensen Nybegynder
29. september 2001 - 19:08 #27
nu er filen dato.asp opdateret, så den viser både u- og formatteret dato...

Datoen i databasen er xx-xx-xx, og derfor er det nødvendigt at bruge format-kommandoen...

Er der en mulighed for, at jeg kan ændre databaseformatettet til xx-xx-xxxx ???
Avatar billede a1a1 Novice
29. september 2001 - 19:08 #28
udtag dato som jeg viste

fx.

din dato variable = dato, og sqldato (til db)

dato = date()
dag = day(dato)
md = month(dato)
aar = year(dato)

sqldato = aar & \"-\" & md & \"-\" & dag`


Det er lige meget hvad access viser den gemmer i dato format, det er nok dig der har valgt at access skal vise datoer sådan....

Avatar billede frank_jensen Nybegynder
29. september 2001 - 19:11 #29
a1 -> nu er jeg forvirret, det drejer sig ikke om visningen overhovedet...

men om at jeg ikke kan kontrollere hvilket datoformat access vælger at gemme i...

og hvordan passer det med dine svar ???
Avatar billede a1a1 Novice
29. september 2001 - 19:16 #30
Jeg ved ikke om du kan kontrollere dato formatet, men hvis du som jeg siger, altid bruger US dato format når du INDSÆTTER datoer i din database vil den korrekte dato blive gemt.

NÅR DU INDSÆTTER DATOER
dato = date() \' ** Er en dato variabel
dag = day(dato)
md = month(dato)
aar = year(dato)

sqldato = aar & \"-\" & md & \"-\" & dag
strSQL = \"INSERT INTO table (dDate) VALUES (#\" & sqldato & \"#) \"


Avatar billede keysersoze Ekspert
29. september 2001 - 19:19 #31
ok - nu er jeg lidt mere med....

prøv at sætte 28-28-01 ind... det kan ikke lade sig gøre!!!

jeg ved ikke hvad det skal bruges til, men for at eksemplet virker skal _indtastningen_ hedde:

mm-dd-åå

og altså ikke dd-mm-åå

Avatar billede frank_jensen Nybegynder
29. september 2001 - 19:29 #32
keysersoze -> selvfølgelig virker d. 28 i 28 ikke, det er jo ikke en valid dato...  til gengæld er 28-02-2001 og 02-28-2001 det samme...

Men jeg tror, at jeg vil implementerer mine updates / inserts, så det bruger US Format, det virker (også på min test-side)...

Men, er der nogen der ligger inde med en funktion, der oversætter datoformatet fra dansk til us ???

a1 -> den kode, du har vist, kræver den ikke et dato-objekt ? fordi at det har jeg jo ikke, da jeg kun har en tekst-streng ?
Avatar billede a1a1 Novice
29. september 2001 - 19:36 #33
hvis din tekst streng er en valid dato er det nok, ASP er jo pisse ligeglad med hvad datatype variablen er :)
Avatar billede keysersoze Ekspert
29. september 2001 - 19:52 #34
frank >> det var bare en test - for den er alligevel en lille smule kvik... det som du indsætter med dd-mm-åå opfatter den som en fejl hvis DIT dd er større end 13 - den vil nemlig have måneden der og derfor bytter den det om... den vil have formattet i mm-dd-åå og gør derfor sit bedste for at rette DIN fejl og derfor bytter den om på nogle ting hvis ikke du indtaster der som mm-dd-åå
Avatar billede frank_jensen Nybegynder
29. september 2001 - 20:08 #35
keysersoze -> Jeg har et JavaScript liggende, der validerer datoen før den blvier sendt til asp-siden, der skal update/inserte recorden, og den validering er ikke i mit test-script...

Men nu har jeg lavet om, så den formatterer om til US format før den gemme, og så er problemet lige pludselig væk...

Så tak for hjælpen
Avatar billede a1a1 Novice
29. september 2001 - 20:14 #36
ja men hvis du laver formatet åååå-mm-dd vil database vide at der er tale om US format, og derfor indsætte den rigtigt, der er jo ikke noget dansk format hvor året kommer først...?
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
Kurser inden for grundlæggende programmering

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