Avatar billede gregersp Nybegynder
19. juli 2002 - 13:41 Der er 18 kommentarer og
2 løsninger

MSSQL, asp og dato

Hejsa.

Det velkendte datoproblem optræder igen, men denne gang har jeg svært ved at
forstå det.

MSSQL-serveren kører med dansk datoformat dd-mm-åååå, men hvis jeg via SQL
skal indsætte,sammenligne eller lign. skal den have formatet mm-dd-åååå?

Hvis jeg sætter den ind i det format, og trækker den ud igen (så det virker,
ellers får jeg fejl om "conversion to smalldatetime") får jeg den tilbage
som dd-mm-åååå?

Jeg har prøvet med local id, men det har tilsyneladende ingen effekt.

Nogen der har engod idé?
Avatar billede neteffect Nybegynder
19. juli 2002 - 14:05 #1
locale id styrer, hvordan datoerne håndteres af dit scriptsprog, fx VBScript, derfor bør den sættes. Ellers er det serverens locale, der kommer til at styre, hvordan scriptsprogets indbyggede funktioner opfatter datoer.
SQL skal have datoer i amerikansk format (mm-dd-åååå) med # før og efter.
Husk at når du bygger et SQL-statement, er det en tekststreng.
Avatar billede a1a1 Novice
19. juli 2002 - 14:10 #2
Hvis du vil være SIKKER så brug ÅÅÅÅ-MM-DD

neteffect -> hvad er forskellen (for en komputer) på mm-dd-åååå og dd-mm-åååå (02-01-2001 og 02-01-2001) ?

Det kræver jo så at sqlserveren/webserver er sat op til at benytte Amerikansk dato format MM-DD-YYYY (SQL dato format ER YYYY-YY-MM, og det er også kun sådan at fx. mySQL vil have datoer)

;o)
Avatar billede a1a1 Novice
19. juli 2002 - 14:16 #3
prøv evt. dette "skrift"

<%
d = "2002-02-28"
Response.Write d & "<br />"
Response.Write cDate(d) & "<br /><br />"

d = "02-28-2002"
Response.Write d & "<br />"
Response.Write cDate(d) & "<br /><br />"

d = "28-02-2002"
Response.Write d & "<br />"
Response.Write cDate(d) & "<br /><br />"
%>

mystisk nok er det alle sammen den samme dato?
Avatar billede a1a1 Novice
19. juli 2002 - 14:33 #4
denne er også "sjov"..
<%
d = "2002-10-11"
Response.Write d & " Month " & Month(d) & "<br />"
Response.Write cDate(d) & "<br /><br />"

d = "10-11-2002"
Response.Write d & " Month " & Month(d) & "<br />"
Response.Write cDate(d) & "<br /><br />"

d = "11-10-2002"
Response.Write d & " Month " & Month(d) & "<br />"
Response.Write cDate(d) & "<br /><br />"
%>

Mystisk nok er den eneste der HELT sikkert er rigtig den øverste...
Avatar billede gregersp Nybegynder
19. juli 2002 - 14:34 #5
Ok, men hvordan gør jeg så sådan at alt input er i dansk og den så skifter det til mm-dd-yyyy.

Der er en indbygget funktion til dette, men jeg kan ikke huske navnet (det pis er ved at gøre mig frustreret nu :()
Avatar billede a1a1 Novice
19. juli 2002 - 14:53 #6
nu skal du jo lave det i formatet YYYY-MM-DD
Avatar billede a1a1 Novice
19. juli 2002 - 14:55 #7
alt input dansk?

define input?

input i databasen? (skal jo være yyyy-mm-dd)
output = på siden (bliver formateret efter dine serverindstillinger (webserveren hvis det er 2 forsk (control panel->regional options->set default-> vælg dansk ))
Avatar billede neteffect Nybegynder
19. juli 2002 - 14:57 #8
-> a1:
SQL skal altid have det på amerikansk. Databasen må selv om, hvordan den gemmer en dato, som den har fået via SQL. Jeg mener ikke serveren påvirker databasens håndtering af datoer, men det kan i nogle tilgælde sættes for databasen selv. Jeg vil anbefale at køre 100% amerikansk. Også for scripts (asp: Session.LCID = 1033). Derved bliver dansk format reduceret til et spørgsmål om præsentation, hvor konvertering fra/til amerikansk format klares med scriptede rutiner.
Avatar billede a1a1 Novice
19. juli 2002 - 15:05 #9
tåge.....
har du læst (prøvet og forstået) hvad jeg skrev

2002-09-11 kan KUN være amerikansk (11. september 2002)
09-11-2002 kan både være 9. november eller 11. september 2002

databasen kan man godt indstille til at tage dk format (dd-mm-yyyy), men default er us'sk. (og så har man jo et problem, hvis man har lavet det til us'sk....)
Avatar billede gregersp Nybegynder
19. juli 2002 - 15:13 #10
Ok, omformulerer mig så.

Jeg leder efter navnet på den indbyggede funktion der kan lave dd-mm-åååå til åååå-mm-dd.

120 pt. til den der kan svare på det, og 30 til den anden.
Avatar billede neteffect Nybegynder
19. juli 2002 - 15:15 #11
-> a1. Nej, jeg har ikke læst det hele. Men jeg har gjort rede for, hvordan jeg får det til at virke i mine egne løsninger. Her er betingelserne, at jeg kender databasen, for den uploader jeg selv, men jeg kan ikke bestemme serverens locale. Desuden laver jeg ofte løsninger, hvor brugergrænsefladen skal skifte mellem engelsk og dansk. Derfor er det iøvrigt heller ikke hensigtsmæssigt at have dansk sortering i databasen.
Avatar billede a1a1 Novice
19. juli 2002 - 15:27 #12
Standard ANSI/ISO SQL-92 has a full specification for dates and times that are based on ISO-8601 standards and should have no Year 2000 problems. This standard requires the "yyyy-mm-dd" format and 24-hour time formats based on the UTC (Universal Coordinated Time, formerly the GMT or Greenwich Mean Time) and has a lot of details in it.

http://www.dbmsmag.com/9707d06.html
meget "sjov" artikel også...

-> neteffect du siger....
SQL skal have datoer i amerikansk format (mm-dd-åååå) med # før og efter. (det der med # dur ikke på sql server, men kun i access?)

dansk eller amerikans sortering giver vel det samme (en dato kommer efter den anden ( også i amerika), det format databasen leverer datoerne i er det som der står i control panel (control panel->regional options->set default-> vælg dansk )
Avatar billede neteffect Nybegynder
19. juli 2002 - 15:31 #13
Der er mig bekendt ikke nogen indbygget funktion til det, hverken i VBScript eller JavaScript. VBScript har funktionen DatePart til at trække elementer ud fra det interne format.
Avatar billede gregersp Nybegynder
19. juli 2002 - 15:34 #14
Jeps, jeg er gået i gang med at skrive en kæææmpe funktion, der kan klare problemet (Det er jo trods alt bare at omarrangere på enhederne i datoen) ;-)

Tak for hjælpen, og for en god diskussion!
Avatar billede neteffect Nybegynder
19. juli 2002 - 15:42 #15
Et råd: I stedet for en kæmpefunktion, så lav dig en samling småfunktioner, som hver især tager deres del af problemstillingen. Jeg kan også anbefale, at du laver to sæt af disse funktioner, nemlig ét sæt til at håndtere datoer alene og ét sæt til at håndtere dato og klokkeslet sammen (AM/PM, you know)
Avatar billede a1a1 Novice
19. juli 2002 - 15:46 #16
I en stored procedure kan du godt...

brug
SET DATEFORMAT dmy
GO
SELECT GETDATE()

SET DATEFORMAT ymd
GO
SELECT GETDATE()

Men jeg ville lave en funktion (i asp) der returnerer datovariablen i yyyy-mm-dd format (så virker det også hvis det er andet end en sqlserver storedprocedure)

:)
Avatar billede gregersp Nybegynder
19. juli 2002 - 15:48 #17
a1> Hvilket jeg præcis har gjort.

Function dato(TempDato)
    dato = year(TempDato) & "-" & month(TempDato) & "-" & day(TempDato)
End Function
Avatar billede a1a1 Novice
20. juli 2002 - 01:34 #18
10 point til dig
Avatar billede a1a1 Novice
20. juli 2002 - 01:35 #19
:)
Avatar billede gregersp Nybegynder
20. juli 2002 - 07:45 #20
Ja, ik.

Jeg har også omgået problemet på den måde før, men ville høre om der var nogen, som havde en bedre løsning, men ak :(
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