03. december 2004 - 10:11Der er
16 kommentarer og 1 løsning
Formatering af dato
I et af de programmer som vi har fået udviklet, afvikles der en SQL streng som udvælger nogle data i en Access database. Nu har vi så forsøgt at portere databasen til vores SQL Server men der går noget galt i SQL strengen, i hvert fald kommer der ikke nogle data tilbage. Jeg er nået så vidt at jeg kan sige det har noget med dato formatet at gøre. Programmet sender 2 variable afsted, Startdato og Slutdato, som i vores test tilfælde indeholder dags dato i begge, i formatet 03/12/2004. Jeg kan dog i Query Analyser se at der kun kan komme data tilbage hvis datoen er i formatet 2004-02-12
Hvordan konverterer jeg datoen? SQL:
SELECT Måler, Dato, klokkeslæt, tæller FROM aflæsninger WHERE Måler='$Måler$' and dato BETWEEN '$Startdato$' and '$Slutdato$' order by dato,klokkeslæt
Du kan bruge SUBSTRING() funktionen til at klippe i teksten.
SELECT Måler, Dato, klokkeslæt, tæller FROM aflæsninger WHERE Måler='$Måler$' and dato BETWEEN SUBSTRING($Startdato$,7,4)+'-'+SUBSTRING($Startdato$,4,2)+'-'+SUBSTRING($Slutdato$,1,2) and SUBSTRING($Slutdato$,7,4)+'-'+SUBSTRING($Slutdato$,4,2)+'-'+SUBSTRING($Slutdato$,1,2)'$Slutdato$' order by dato,klokkeslæt
Jeg har aldrig brugt convert funktionen på denne måde, men det virker måske:
SELECT Måler, Dato, klokkeslæt, tæller FROM aflæsninger WHERE Måler='$Måler$' and dato BETWEEN CONVERT(datetime, $Startdato$, 103) and CONVERT(datetime, $Slutdato$, 103) order by dato,klokkeslæt
Jeg havde desuden fået lavet den tidligere forkert. Det skal være: SELECT Måler, Dato, klokkeslæt, tæller FROM aflæsninger WHERE Måler='$Måler$' and dato BETWEEN SUBSTRING($Startdato$,7,4)+'-'+SUBSTRING($Startdato$,4,2)+'-'+SUBSTRING($Startdato$,1,2) and SUBSTRING($Slutdato$,7,4)+'-'+SUBSTRING($Slutdato$,4,2)+'-'+SUBSTRING($Slutdato$,1,2) order by dato,klokkeslæt
Når jeg prøver med dit SUBSTRING forslag, mister programmet forbindelsen til serveren. Når jeg prøver med CONVERT, er forbindelsen stadig i orden, men der kommer ingen data tilbage.
Hvis jeg smider denne streng ind i Query Analyser, kommer der heller ingen resultater. SELECT Måler, Dato, klokkeslæt, tæller FROM aflæsninger WHERE dato BETWEEN CONVERT(datetime, 03/12/2004, 103) and CONVERT(datetime, 03/12/2004, 103) order by dato,klokkeslæt
Dec 3 2004 12:00AM Dec 3 2004 12:00AM Dec 3 2004 12:00AM Dec 3 2004 12:00AM Mar 12 2004 12:00AM Mar 12 2004 12:00AM Mar 12 2004 12:00AM Dec 3 2004 12:00AM Dec 3 2004 12:00AM
Hvorfor er der tidsangivelse med også? Feltet i databasen er Column name Data type Length Allow Nulls ********************************************** dato datetime 8 Ja
Convert laver netop værdien om til DateTime typen, så databasen kan arbejde med det, det tal du skriver angiver hvilket format den tekst der kommer ind er på. Resultatet vil altid være på databasens dato format.
Det er ¤%¤% noget værre ¤¤%¤! :( Nå, men ved du hvordan man "fortæller" at noget i en SQL streng skal betragtes som en dato (og ikke som en streng etc.)
Det er netop det du gør med convert.... Der konvertere vi til DateTime. Du burde også kunne bruge alle datofunktionerne på den. Det er derfor jeg synes det er mærkligt.
ellers skal du prøve med cast() funktionen, men der kan jeg ikke love at den opfatter det som den rigtige dato. CAST($Startdato$ as DateTime)
Ja, men jeg tror løsningen bliver at min kollega kontakter firmaet der har lavet programmet og beder dem om en modificeret udgave (det er special software)
Synes godt om
Ny brugerNybegynder
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.