Avatar billede kimand Nybegynder
07. december 2006 - 10:31 Der er 19 kommentarer

Problemer med dato i Access.

Jeg har en hjemmeside med en database hvor i jeg har et felt med datotypen ”dato og klokkeslæt”.
I dette felt indsætter jeg værdien ”Date”.

Når jeg så trækker data ud fra databasen sorterer jeg efter dato.

Dette har virket fint nok indtil nu.

Problemet er at jeg skal flytte min hjemmeside fra lokal pc, med dansk win xp, til en server med engelsk win 2003 server.

Når jeg så skriver til databasen bliver mine datoer skrevet ind i formatet ”mm-dd-yyyy”
Problemet er at jeg allerede har et hav af poster i formatet ”dd-mm-yyyy”, og derfor ønsker at beholde dette format.

Hvis jeg laver en ”Response.Write Date” kommer datoen ud i det rigtige format ”dd-mm-yyyy”
Dvs.. at problemet som jeg ser det, ligger i access, som ikke gemmer i ”dd-mm-yyyy” formatet.

Hvordan tvinger jeg Access til at gemme i det format jeg ønsker.
Avatar billede fennec Nybegynder
07. december 2006 - 10:39 #1
En ting er hvad format du ser datoer i i Access og ASP, noget andet er hvilket format du skal bruge til at kommunikere med. Access bruger her mm-dd-yyyy formatet, så du skal konvertere dine datoer til dette format, nå du bruge dem i SQL-sætninger.

Du får en konverteringse funktion om 5 min.
Avatar billede cpufan Juniormester
07. december 2006 - 10:40 #2
access gemmer altid i mm-dd-yyyy

så det er et spgm og at vise det korrekt på siden når det trækkes ud igen.

det nemmeste er at
sætte sessionen til dansk:

<%session.lcid = 1030%>

en mere bøvlet måde er at konvertere din dato:

dato = day(rs("dato"))&"-"&month(rs("dato"))&"-"&year(rs("dato"))
Avatar billede fennec Nybegynder
07. december 2006 - 10:41 #3
function DBDate(fDate)
dim fDag, fMon, fYear
    fDag = right("0"& day(fDate))
    fMon = right("0"& month(fDate))
    fYear = year(fDate)
    DBDate = fMon &"-"& fDay &"-"& fYear
end function
Avatar billede tras Juniormester
07. december 2006 - 10:41 #4
i din insert skal du bare skrive date sådan date("d-m-Y"); Du kan jo slå det op inde på www.php.net og søg efter date!
Avatar billede fennec Nybegynder
07. december 2006 - 10:44 #5
cpufan >>
Det hjælper ikke noget at sætte LCID'en til dansk, da det netop er dd-mm-yyyy formatet. Du skal der i mod sætte det til engelsk format, som kører mm-dd-yyyy (måske 1033 som er mm/dd/yyyy)

Tras >>
Dette er ikke PHP :o)
Avatar billede tras Juniormester
07. december 2006 - 10:48 #6
Så du siger alså jeg ikke kan bruge dette*?!
Avatar billede kimand Nybegynder
07. december 2006 - 10:49 #7
til jer alle.
I skriver at Access altid gemmer i formatet "mm-dd-yyyy".
Dette er ikke rigtigt. da siden lå lokalt på min danske win xp maskine skrev Access datoen i "dd-mm-yyyy" formatet.

Og den med LCID=1030 har jeg prøvet, hvilket ikke virker.

Kan jeg virkelig ikke tvinge Access til at skrive ind i "dd-mm-yyyy" formatet ligesom da siden lå lokalt?
Avatar billede fennec Nybegynder
07. december 2006 - 11:07 #8
Spørgsmålet er hvilke datoer du brugte da den lå lokal. F.eks vil 31-10-2006 og 10-31-2006 virke og blive indsat som 31. okt, mens 01-10-2006 og 10-01-2006 vil blive indsat som 1. okt og 10. jan.

Hvis du derfor kun har indsat datoer hvor dagen var den 13 eller højre er det derfor det virkede lokalt.

Men bare brug min konverterings funktione så virker det:
sql = "insert into enTabel(enDato) values(#"& DbDate(date()) &"#)"
Avatar billede fennec Nybegynder
07. december 2006 - 11:16 #9
tras >>
Ja. Det er lidt svært at bruge PHP funktioner i ASP. Og specielt som kald i en SQL-sætning til Access, hvor vi kun kan gøre brug af Access funktionerne :o)
Avatar billede kimand Nybegynder
07. december 2006 - 12:17 #10
fennec>>

Det er ikke fordi at jeg er utilfreds med dine svar.

Jeg har datoer af både høje og lave dage. Og det virkede der.

Jeg tænkte... Kunne en løsning evt være at skrive datoen ind som en string værdi, og så derefter bruge funktionen "CDate(datoen)" når jeg henter ud fra databasen.???
Avatar billede fennec Nybegynder
07. december 2006 - 12:58 #11
Det er første gang jeg har hørt om at Access vil tage dd-mm-yyyy formatet.

Et problem med databaser er netop at de alle kører med hver deres dataformat (til komunikation). Access bruger mm-dd-yyyy, MS-SQL bruger yyyymmdd og MySQL bruger yyyy-mm-dd. Derfor har man altid en dateconverter funktion som konveter datoer til det rigtige format.

Vær opmærksom på at fordi du indsætter i mm-dd-yyyy, betyder det ikke at datoen bliver vist på samme måde på siden. Det er udelukkende LCID'en, der bestemmer formatet af datoen når den bliver vist.

Jeg vil kraftig fraråde at ændre datoformatet til tekst, da du så mister muligheden for at sortere (og mange andre ting) på kolonnen.
Avatar billede fennec Nybegynder
07. december 2006 - 13:10 #12
Kan du evt give os et eks på en kode stump som fejler??
Avatar billede kimand Nybegynder
07. december 2006 - 13:19 #13
fennec>>

Der er som sådan ikke noget der fejler. Jeg kommer bare til at have en database med to forskellige formater. og jeg ville helst bare have Access til at accepterer mine danske datoformater, da det for virker lettest at arbejde med.

Din argumentation for ikke at arbejde med datoerne som string, havde jeg ikke lige tænkt på, og kan nu godt se problematikken. Det var ikke en holdbar løsning. Tak.

Du skriver at det udelukkende er LCIDén som bestemmer formatet af datoen nå den bliver vist.

Jeg har sat følgende funktion ind i toppen af min side,
"<%@language=VBScript LCID=1030%>", men det ændre ikke på formateringen. Jeg har eksempel en dato som heder 12-01-2006 (alså 1 Dec. 2006) og den bliver betragtet som 12 jan. 2006.

Ps. Du skal nok få pointne.
Avatar billede cpufan Juniormester
07. december 2006 - 13:28 #14
man kan nu godt lave sortering selvom det er i tekstformat,
men så skal formatet være yyyymmdd
Avatar billede kimand Nybegynder
07. december 2006 - 13:30 #15
cpufan>>

Du har ret, men så er jeg jo lige vidt.
Avatar billede fennec Nybegynder
07. december 2006 - 13:56 #16
Kan vi lige få afklaret noget. Alle de datoer, som ligger i databasen nu, bliver vist som den rigtige dato??

Problemet er så at nogle datoer, f.eks "07-12-2006" (7. dec) er blevet indsat i databasen, og i stedet for at være den 7. dec bliver de opfattet som 12. juli.

Hvis du åbner databasen på serveren vil datoer her blive vist efter computerens locale settings. I dette tilfælde engelsk, så datoer indtastet manuelt via Access skal følge dette format.
Avatar billede kimand Nybegynder
08. december 2006 - 10:54 #17
Ok. Nu bliver du nok forvirret!

Når jeg skriver ind skrives formatet i "mm-dd-yyyy" formatet", men når jeg trækker ud sorteres efter "dd-mm-yyyy" formatet.

Forstået at nå jeg skriver datoen 7 Dec 2006 altså 07-12-2006 gemmes den i Access som 12-07-2006. når jeg så skal trække ud fra databasen og sorterer efter datoen sorteres datoen som 12-07-2006.

Dvs. at jeg får ikke vendt datoen tilbage til hvad den i sin tid var ment som.

Giver dette nogen mening ???
Avatar billede ldanielsen Nybegynder
12. december 2006 - 15:13 #18
Datoer i en database bliver ikke gemt i et bestemt format, de bliver gemt som et tal, som oftest som antallet af milisekunder siden en bestemt dato.

Så er en dato først kommet korrekt ind i en database er det helt sikkert at den bliver ved med at være korrekt.

Der er to problemer i det:
1: At skrive en dato til databasen. Vi har jo typisk en streng, og så skal den oversættes til en dato på en eller anden måde.
2: At hente den dato ud. Den kommer ud som en streng, og hvordan sikrer vi at den blive i det format vi ønsker?

At skrive til databasen er, med Access, lettest at gøre med ADO:

'Uddrag:
Rec.Open "Select dtmDatofelt FROM Tablename WHERE ID = 25", , 3, 3
Rec("dtmDatofelt") = DateSerial(2005, 3, 25)
Rec.Update
Rec.Close

Jeg bruger DateSerial fordi det gør det klart hvad der er dag og måned. Du skal så selv sørge for at få et input som du har styr på. Resultatet er en VBScript dato, og den er lige så "formatløs" som datofeltet i databasen, så resultatet bliver altid rigtigt.

At hente er let. Sæt Session.LCID = 1030, og:

Session.LCID = 1030
Rec.Open "Select dtmDatofelt FROM Tablename WHERE ID = 49", , 0, 1
Response.Write(Rec("dtmDatofelt"))
'eller evt:
Response.Write(FormatDateTime(Rec("dtmDatofelt"), 1)
'hvor 0, 1, 2, 3 eller 4 giver forskelligt resultat, se http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/0a8270d7-7d8f-4368-b2a7-065acb52fc54.asp
Rec.Close
Avatar billede kimand Nybegynder
29. februar 2008 - 11:43 #19
ok
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