Avatar billede mothwe Nybegynder
10. marts 2002 - 21:39 Der er 17 kommentarer og
1 løsning

Dato-format

Når jeg skriver dags dato til min Access-database med funktionen Now, ser formatet sådan her ud:

03-10-2002 21:30:34 (3. okt. 2002)

og ikke som det korrekt skal se ud:

10-03-2002 21:30:34 (10. marts 2002)

Også selvom jeg bruger <% Session.LCID = 1030 %> i ASP-dokumentet. Hvad går der galt ???

Serveren kører engelsk styresystem, men sat op til dansk locale.
Avatar billede arriva Nybegynder
10. marts 2002 - 21:42 #1
det er selve uret på serveren der kører forkert så...
Avatar billede arriva Nybegynder
10. marts 2002 - 21:43 #2
...for selve formatet er jo rigtigt nok, eftersom at den skriver det som dd-mm-yyyy og ikke som det engelsk mm-dd-yyyy
Avatar billede mothwe Nybegynder
10. marts 2002 - 21:46 #3
Datoen på serveren er rigtig nok - 10. marts! Men når jeg skriver til databasen siger datoen: 3. oktober 2002
Avatar billede coltau Juniormester
10. marts 2002 - 21:52 #4
Du skal konsekvent skrive datoer til Access (og andre databaser) i formatet: MM-DD-YYYY.
Specielt hvis du anvender LCID = 1030 for så vil Now jo anvende formatet: DD-MM-YYYY.

Access vender altid om på måned og dag "hvis det giver en korrekt dato" Hvis det giver en ukorrekt dato vil den acceptere DD-MM-YYYY og det er det farlige ved det.
Avatar billede mothwe Nybegynder
10. marts 2002 - 21:53 #5
Nej, nu forstår jeg ingenting! Jeg har en side hvor jeg kan oprette et element i min Access-database:

<%

Const adOpenKeyset = 1
Const adLockOptimistic = 3

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "PROVIDER=MSDASQL;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("../log/nyheder.mdb")

    Set rs = Server.CreateObject("ADODB.RecordSet")
    strSQL = "Select * From Nyheder"
    rs.Open strSQL, Conn, adOpenKeyset, adLockOptimistic

      rs.AddNew
      rs("Overskrift") = Request.form("overskrift")
      rs("Nyhed") = Request.form("Nyhed")
      rs("Dato") = Now
      rs.Update

    rs.Close
    Set rs = Nothing

Conn.Close
set Conn = Nothing
%>

Her skriver den det RIGTIGE dato-format. Men på en anden side kan jeg redigere i allerede eksisterende elementer i databasen:

<%
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.MapPath("../log/nyheder.mdb")

SQLstmt = "UPDATE DISTINCTROW Nyheder SET overskrift= '" & request.form("overskrift") & "', dato = #" & Now & "#, nyhed = '" & request.form("nyhed") & "' WHERE id = " & Request("id")
'SQLstmt = SQLstmt & " VALUES (" & request.form("nyhed") & ",#" & Now & "#,'" ,'" & request.form("Overskrift") & ")"

'response.write SQLstmt

Conn.Execute (SQLstmt)

conn.Close
Set conn = nothing
Set SQLstmt = nothing

response.redirect ("default.asp")
%>

Den opdaterer også datoen - I FORKERT FORMAT !!!!!

Nu forstår jeg intet !!
Avatar billede arriva Nybegynder
10. marts 2002 - 22:00 #6
har du sat access rowet til at være et dato felt?
Avatar billede coltau Juniormester
10. marts 2002 - 22:03 #7
Eksempel:
SQL = "update tabel set dato='#03-10-2002#'"
Access ser datoen som MM-DD-YYYY og gemmer datoen som 10-Marts-2002

SQL = "update tabel set dato='#23-12-2002#'"
Access ser datoen som MM-DD-YYYY og opdager at det bliver en forkert dato hvorefter den acceptere at det er DD-MM-YYYY og gemmer datoen som 23-December-2002

Hvis du ikke tror på det bliver du mere overrasket. ASP anvender nemlig samme ulogiske metode intern. (Kommandoen CDate)

Det eneste du kan gøre er at anvende MM-DD-YYYY i SQL-sætninger.
Eks1: SQL = "update tabel set dato='#10-03-2002#'"
' Access gemmer korrekt 3-Okt-2002
Eks2: SQL = "update tabel set dato='#12-23-2002#'"
' Access gemmer korrekt 23-Dec-2002

Når du så henter datoerne frem fra databasen og skal vise dem skal du ikke ændre dem da LCID = 1030 nok skal sørge for at de vises korrekt.
Avatar billede mothwe Nybegynder
10. marts 2002 - 22:04 #8
Ja, "General Date" (19-06-1994 17:34:23)
Avatar billede coltau Juniormester
10. marts 2002 - 22:06 #9
Så du må altså ikke anvende denne:
rs("Dato") = Now
sammen med denne:
Session.LCID = 1030
for så vil Now være i formatet DD-MM-YYYY når datoen gemmes og det bytter Access straks om på.
Avatar billede mothwe Nybegynder
10. marts 2002 - 22:08 #10
Jamen Coltau - hvis du har ret i det du skriver, hvorfor vil den så skrive det RIGTIGE dato-format i min første eksempel, men når jeg så efterfølgende retter i den tabel via det andet eksempel, så skriver den det FORKERTE dato-format når den opdaterer !!!
Avatar billede coltau Juniormester
10. marts 2002 - 22:22 #11
Du mener altså at der er forskel på de to eksempler som du viser.
1. Indsæt med OpenKeyset giver korrekt dato. ?
2. Update med SQL-sætning giver forkert dato. ?

Jeg checker det med det samme.
Avatar billede mothwe Nybegynder
10. marts 2002 - 22:23 #12
Ja - præcist !!!
Avatar billede mothwe Nybegynder
10. marts 2002 - 22:29 #13
Jeg smider lige lidt flere point på :)
Avatar billede coltau Juniormester
10. marts 2002 - 22:38 #14
Jeg har testet de 4 måder for insert/update med nedenstående kode:

<%
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.MapPath("test.mdb")

sub InsertDato
  Set RS = Server.CreateObject("ADODB.Recordset")
  RS.Open "select * from upddato", objConn, 1, 3
  RS.AddNew
  RS("Dato") = Now ' Anvender DD-MM-YYYY
  RS.Update
end sub

sub UpdateDato
  Set RS = Server.CreateObject("ADODB.Recordset")
  RS.Open "select * from upddato where ID=1", objConn, 1, 3
  RS("Dato") = Now ' Anvender DD-MM-YYYY
  RS.Update
end sub

sub SQLUpdateDato
  ' Anvender MM-DD-YYYY
  objConn.Execute("update upddato set dato=#" & Now & "# where ID=1")
end sub

sub SQLInsertDato
  ' Anvender MM-DD-YYYY
  objConn.Execute("insert into upddato (dato) values (#" & Now & "#)")
end sub

' Call SQLUpdateDato
' Call UpdateDato
' Call SQLInsertDato
Call InsertDato

Set RS = objConn.Execute("select * from upddato")
Response.Write("Dato: " & RS("Dato"))
%>

Resultatet er som du selv er inde på forvirrende. Det betyder at man skal være ekstra påpasselig med datoer. (De er irriterende nok i forvejen.)

Jeg går lidt videre for at finde årsagen. !
Avatar billede mothwe Nybegynder
10. marts 2002 - 22:41 #15
Coltau - ja, det er nemlig sk... irriterende - jeg håber du kan finde frem til en løsning (jeg kan ikke)! Så siger du bare hvor mange point du vil have (er der ikke et loft på 200 *S*)
Avatar billede coltau Juniormester
10. marts 2002 - 22:55 #16
Rolig rolig. Jeg er selv lige så interesseret.
Avatar billede coltau Juniormester
11. marts 2002 - 00:34 #17
Hvis det havde været Delphi/Pascal havde jeg ikke været et sekund i tvivl om at der er forskel på de to metoder. (Alle variable i Pascal er typedefineret og skal altid typekonverteres i forhold til den sammenhæng de anvendes i.)

I SQL-sætningen oversættes datoen (Now) fra ASP-internt/binært format til tekst og der anvendes Session.LCID, hvilket giver formatet: DD-MM-YYYY.
Når SQL-sætningen sendes til Access skal datoen oversættes fra tekst til det binære format i databasen. På det tidspunkt ved SQL-oversætteren ikke noget om ASP eller LCID så den oversætter datoen ud fra egne kriterier som er MM-DD-YYYY.

I det andet tilfælde (RS("dato") = Now) skal datoen (Now) ikke oversættes til tekst men sendes til Access i det interne format (som databasen ønsker) direkte, hvilket gør at der ikke ændres på dag og måned.

Hvorfor vi bliver forvirret er fordi variabler i ASP er "sent bundet" eller typeløse. Det betyder at vi ikke bemærker den forskel der egentlig er på de to sætninger.

Eks 1.
objConn.Execute("update upddato set dato=#" & Now & "# where ID=1")
I dette tilfælde bliver Now typekonvertert til en string. (tekst)

Eks 2.
  RS("dato") = Now
I dette tilfælde bliver Now anvendt som det binære format det repræsentere i ASP.
Avatar billede mothwe Nybegynder
19. januar 2003 - 12:36 #18
Jeg lukker spørgsmålet - jeg blev ikke klogere!
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