Avatar billede puppetmaster Nybegynder
03. december 2004 - 10:11 Der 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
Avatar billede fennec Nybegynder
03. december 2004 - 10:25 #1
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
Avatar billede fennec Nybegynder
03. december 2004 - 10:37 #2
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
Avatar billede puppetmaster Nybegynder
03. december 2004 - 10:48 #3
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.
Avatar billede puppetmaster Nybegynder
03. december 2004 - 10:58 #4
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
Avatar billede puppetmaster Nybegynder
03. december 2004 - 11:10 #5
Query Analyser returnerer resultater hvis jeg bruger
12/03/2004
men ikke med
03/12/2004
Avatar billede fennec Nybegynder
03. december 2004 - 11:13 #6
prøv at ændre 103 til 101. Det er et andet datoformat. Jeg kan have taget fejl af dem, og hvilken der skal bruges.
Avatar billede puppetmaster Nybegynder
03. december 2004 - 11:17 #7
Heller ikke ....suk.
Er der en måde man kan se/checke resultatet af
CONVERT(datetime, $Startdato$, 103)
($Startdato$ er lig med 03/12/2004)
Avatar billede puppetmaster Nybegynder
03. december 2004 - 11:18 #8
Åbenbart med
print CONVERT(datetime, '12/03/2004', 101)
Avatar billede puppetmaster Nybegynder
03. december 2004 - 11:20 #9
print CONVERT(datetime, '12/03/2004', 20)
print CONVERT(datetime, '12/03/2004', 21)
print CONVERT(datetime, '12/03/2004', 101)
print CONVERT(datetime, '12/03/2004', 102)
print CONVERT(datetime, '12/03/2004', 103)
print CONVERT(datetime, '12/03/2004', 104)
print CONVERT(datetime, '12/03/2004', 105)
print CONVERT(datetime, '12/03/2004', 120)
print CONVERT(datetime, '12/03/2004', 121)

Giver

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
Avatar billede puppetmaster Nybegynder
03. december 2004 - 11:22 #10
Hvorfor er der tidsangivelse med også?
Feltet i databasen er
Column name  Data type  Length  Allow Nulls
**********************************************
dato          datetime    8          Ja
Avatar billede puppetmaster Nybegynder
03. december 2004 - 11:23 #11
Eksempel på værdi i feltet:
12/02/2004
Avatar billede fennec Nybegynder
03. december 2004 - 11:31 #12
Det kan jeg ikke forstå.

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.
Avatar billede puppetmaster Nybegynder
03. december 2004 - 11:55 #13
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.)
Avatar billede fennec Nybegynder
03. december 2004 - 12:04 #14
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)
Avatar billede puppetmaster Nybegynder
09. december 2004 - 13:25 #15
Mærkeligt.......kunne du smide et svar, for jeg kommer det ikke nærmere, har givet opgaven tilbage til vedkommende den kom fra! :)
Avatar billede fennec Nybegynder
11. december 2004 - 16:59 #16
Det kunne nu være rart at have fundet en løsning på problemet.
.o) <-- One Eyed Jack
Avatar billede puppetmaster Nybegynder
13. december 2004 - 08:08 #17
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)
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
Computerworld tilbyder specialiserede kurser i database-management

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