Avatar billede axkris Nybegynder
10. december 2005 - 14:38 Der er 7 kommentarer og
1 løsning

Får en dato i 1800'tallet

Hej alle

Jeg får indsat en dato engang i 1800'tallet, når jeg kører følgende:

strOrderDate = "01-01-2006"
strSQL = "SET DATEFORMAT DMY INSERT INTO ...... DATEADD(d, 30, " & strOrderDate & ")......."

Hvordan plusser man nemest 30 dage til OrderDate?
Avatar billede innercitydk Nybegynder
10. december 2005 - 15:02 #1
Hvilket sprog programmerer du i? Istedet for at lave et datofelt i databasen så lav det som tekstfelt og styr formateringen af datoen fra din programkode. Du kan stadig lave forespørgsler der sorterer efter dato eller hvad du vil selvom at det er et tekstfelt..

Vh
Avatar billede axkris Nybegynder
10. december 2005 - 15:04 #2
Jeg kører med asp, men jeg kan ikke lave om på databasen, da den bruges af et andet (ikke-internet) program, som skal have dataen på en helt bestemt måde ellers går det ned.
Avatar billede axkris Nybegynder
10. december 2005 - 15:08 #3
ahhh nu virker det, der skulle bare nogle plinger på:

DATEADD(d, 30, '" & strOrderDate & "')
Avatar billede innercitydk Nybegynder
10. december 2005 - 15:37 #4
Nice
Avatar billede ldanielsen Nybegynder
11. december 2005 - 16:44 #5
At lave det om til et tekstfelt er et rigtigt dårligt råd. En væsentlig del af spørgsmålene angående datoer i databaser opstår fordi man har valgt at bruge tekstfelter. Og jeg har tit hjulpet med det, og lokket "frafaldne" til at bruge datofelter. Det er ikke svært.

axkris har vist fint styr på det, han bruger jo fx, DATEADD(). Med funktionerne DATEADD, DATEPART og DATEDIFF kan man lave alt hvad hjertet begærer.

En stor hurdle, som ofte gør at mindre rutinerede programmører vælger at benytte tekstfelter, er insert af datoer, men med SET DATEFORMAT dmy kommandoen er man ude over det; man fortæller databasen hvordan den skal fortolke det input der er på vej.


axkris > Du kunne også gøre det via ADO, det modsvarer lidt det man ofte kalder parametre

I uddrag:

...

Com.CommandText = SELECT dtmDato FROM Tabellen"
Rec.Open Com, , 3, 3
Rec.AddNew
Rec("dtmDato") = DateSerial(2005, 12, 11)
Rec.Update
Rec.Close

Fordelen ved det er at du har mulighed for at validere datoen inden du forsøger en insert, så du undgår en overflow fejl fra MSSQL. Hvis du fx kommer med 30. feb eller sådan noget.


DateSerial er rigtig fin:

arrDate = Split("2005-02-30", "-")

'Det følgende giver IKKE en fejl, men resulterer i datoen 2. marts 2005!!
dtmDato = DateSerial(arrDate(0), arrDate(1), arrDate(2))

'Så jeg sammenligner med strengen:
if Datepart("m", dtmDato) = Cint(arrDate(1) then
  bDatoValid = True
else
  bDatoValid = False
end if
Avatar billede ldanielsen Nybegynder
11. december 2005 - 16:44 #6
Manglede lige en )

if Datepart("m", dtmDato) = Cint(arrDate(1)) then
Avatar billede axkris Nybegynder
11. december 2005 - 16:48 #7
Takker - men det fungerer jo perfekt. Dataen bliver netop dato-formateret DMY og lagt ned i et dato-felt. Årsagen var blot, at jeg havde glemt plingerne.

FRA:
DATEADD(d, 30, " & strOrderDate & ")

TIL:
DATEADD(d, 30, '" & strOrderDate & "')
Avatar billede skwat Praktikant
12. december 2005 - 23:52 #8
lyt lidt mere til ldanielsen, en dato er en dato ikke en string.

Du kan rende ind i en masse problemer hvis du flytter platform, eller ændre dine regionalle settings.

Blot et råd.
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

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