Avatar billede benneharli Juniormester
03. april 2006 - 12:58 Der er 26 kommentarer og
3 løsninger

sortering efter dato

Jeg har en saetning der ser saaledes ud:

SELECT * FROM IDWorksView WHERE TenantName = '$tenant1name' AND GroupName = '$groupStr' ORDER BY convert(datetime,convert(char(10),Custom05,112))  DESC

Mit problem er, at datoerne bliver sorteret saaledes:

03/04/2006
02/04/2006
01/11/2006
01/04/2006
01/03/2006
10/01/2005
03/03/2005

Hvad gor jeg forkert???

/Benji
Avatar billede bennytordrup Nybegynder
03. april 2006 - 13:00 #1
Lad være med at caste datoerne i Order by
Avatar billede benneharli Juniormester
03. april 2006 - 13:02 #2
Ikke forstaet???
Avatar billede dr_chaos Nybegynder
03. april 2006 - 13:03 #3
SELECT * FROM IDWorksView WHERE TenantName = '$tenant1name' AND GroupName = '$groupStr' ORDER BY Custom05 DESC
Avatar billede benneharli Juniormester
03. april 2006 - 13:05 #4
nix... det virker i hvart fald ikke...
Avatar billede bennytordrup Nybegynder
03. april 2006 - 13:05 #5
Hvad type er Custom05
Avatar billede benneharli Juniormester
03. april 2006 - 13:07 #6
Almindelig tekst...
Avatar billede benneharli Juniormester
03. april 2006 - 13:09 #7
50 char
Avatar billede bennytordrup Nybegynder
03. april 2006 - 13:09 #8
Hvilken dato (langt datoformat) er 01/11/2006? Hvis jeg tolker listen korrekt, så er det 11. januar 2006, da de øvrige datoer nok er mm/dd/yyyy.

Du caster datoen til ISO-formatet og sorterer efter den, og iso-formatet er yyymmdd.

Hvis det viste datoformat er på formen mm/dd/yyyy, så er listen korrekt.

Prøv at oprettet den 14. januar 2006 og se hvor, den labder i listen.
Avatar billede bennytordrup Nybegynder
03. april 2006 - 13:10 #9
Hvordan query analyser rent faktisk viser datoerne, er irrelevant, da det er op til klientprogrammet at formattere datoer.
Avatar billede benneharli Juniormester
03. april 2006 - 13:11 #10
det der bliver vist er mm/dd/yyyy og jeg skal bruge dd/mm/yyyy

kode 101 giver amerikansk standard, og selvom jeg aendrer det til 112, sker der ikke noget...
Avatar billede benneharli Juniormester
03. april 2006 - 13:13 #11
Altsaa:
Formatet i Custom05 er dd/mm/yyyy
Det der skal vises er dd/mm/yyyy
Det der bliver sorteret efter er aabenbart somom det er mm/dd/yyyy
Avatar billede bennytordrup Nybegynder
03. april 2006 - 13:21 #12
Prøv at oprette 14. januar i den tabel, du henter fra. Hvis du henter forventer data på formen dd/mm/yyyy, og SQL Serveren forventer dem i formen mm/dd/yyyy, så får du en fejlmelding.

Og for mig lugter det af, at SQL Server fortolker det som mm/dd/yyyy
Avatar billede benneharli Juniormester
03. april 2006 - 13:23 #13
yep... nu er der ingen resultater...

hvad kan losningen saa vaere?
Avatar billede benneharli Juniormester
03. april 2006 - 13:23 #14
jeg korer PHP op imod en MSDE
Avatar billede ldanielsen Nybegynder
03. april 2006 - 13:36 #15
Du skulle overveje at benytte et datetime felt i stedet for tekst.
Avatar billede bennytordrup Nybegynder
03. april 2006 - 13:41 #16
Jeg kender ikke PHP, men ud fra ovenstående, så er dine data sorteret korrekt. 14. januar burde komme i din liste således:

03/04/2006
02/04/2006
01/14/2006
01/11/2006
01/04/2006
01/03/2006
10/01/2005
03/03/2005

da formatet er mm/dd/yyyy
Avatar billede bennytordrup Nybegynder
03. april 2006 - 13:42 #17
Og jeg er helt enig med Danielsen med hensyn til optimalt valg af datatype. Gem som datetime og lad MSDE om håndtering/sortering osv. af datoer. Så kan du koncentrere kræfterne om at få php til at vise formatet efter ønske.
Avatar billede ldanielsen Nybegynder
03. april 2006 - 14:11 #18
Når man bruger datetime bliver alt med sortering og gruppering af datoer meget let.

Men der opstår tre problemer; at gemme datoer i databasen, at vise datoer frem på siderne og at select'e poster fra en bestemt dato eller periode.

At gemme: Det kan gøres på mange måder, men den simpleste er at fortælle MSSQL hvilket format den kan forvente, inden man gør det, med SET DATEFORMAT:

SET DATEFORMAT dmy; INSERT INTO TableName (dtmDato) VALUES ('10-4-2005')

At vise frem på siden: De fleste måder at hente datoer på resulterer i et datoobjekt når man henter et datetime felt ud. Så du kan formatere datoen via php, asp eller hvad det nu er du bruger, med din platforms normale datofunktioner. Eller du kan få MSSQL til det:
SELECT CONVERT(varchar(10), dtmDato, 105) AS strDato FROM TableName
- hvor 105 er italian style: dd-mm-yyyy. Der er en helt række formater som du kan finde i dokumentationen.

At select'e: Poster fra en bestemt dato hentes sådan:
SET DATEFORMAT dmy; SELECT * FROM Tablename WHERE DATEDIFF(d, dtmDato, '1-5-2004') = 0
Avatar billede bennytordrup Nybegynder
03. april 2006 - 14:44 #19
ldanielsen >>

At gemme kan håndteres nemmere, idet man kan kommunikere datoer i ISO-formatet (yyyymmdd). Herved behøver man ikke bekymre sig om datoformat, idet SQL Server ALTID vil genkende dette format korrekt uanset det aktuelle datoformat.

insert into tablename (dtmDato) values ('20050410')

for at indsætte dit eksempel.

Det er korrekt, at du kan bede SQL Serveren om at formattere datoer, men det IMHO dybt ukorrekt, da du derved besværliggør eventuelle brugerpræferencer i GUI systemet. Det bør altid være klient-koden, som sørger for formattering.

Omkring select, så er din metode fin nok - du behøver dog ikke at sætte noget datoformat, hvis du benytter ISO-formatet.

select * from tablename where datediff(d, dtmDato, '20040501') = 0
Avatar billede benneharli Juniormester
03. april 2006 - 14:59 #20
mit problem er at jeg ikke har mulighed for at aendre i database strukturen.

det er en database der "tilhorer" et eksternt program.

men hvis man bruger kode 103 (som er formatet dd/mm/yyyy), burde det saa ikke virke???
Avatar billede bennytordrup Nybegynder
04. april 2006 - 08:14 #21
Prøv den her

SELECT * FROM IDWorksView WHERE TenantName = '$tenant1name' AND GroupName = '$groupStr' ORDER BY convert(datetime, Custom05, 101)  DESC


101 er amerikansk format med 4-cifret årstal.
Avatar billede ldanielsen Nybegynder
04. april 2006 - 09:00 #22
bennytordrup har ret

Vi blev vist enige om at datoerne står som mm/dd/yyyy i tekstfeltet, ikke? Så du skal faktisk bare gøre det du heletiden har gjort, men benytte style 101 i stedet
Avatar billede bennytordrup Nybegynder
04. april 2006 - 09:18 #23
Ikke som han hele tiden har gjort. Han har to gange convert i sin order by.
Avatar billede ldanielsen Nybegynder
04. april 2006 - 11:16 #24
Korrekt, det glemte jeg

Det du siger 04/04-2006 08:14:41 ser rigtigt ud.
Avatar billede benneharli Juniormester
05. april 2006 - 20:38 #25
SELECT * FROM IDWorksView WHERE TenantName = '$tenant1name' AND GroupName = '$groupStr' ORDER BY convert(datetime, Custom05, 101)  DESC

virker heller ikke...
Avatar billede benneharli Juniormester
05. april 2006 - 20:40 #26
Custom05 er et almindeligt tekstfelt.
datoerne staar dd/mm/yyyy i feltet.
Avatar billede bennytordrup Nybegynder
06. april 2006 - 08:19 #27
Ud fra de datoer, du i det indledende post har smidt ud til os, kan det IKKE entydigt afgøres, om foratet der dd/mm/yyyy eller mm/dd/yyyy!

For at vi kan hjælpe dig videre, SKAL du få oprettet en post i tabellen, hvor dagen ligger efter den 12. i en måned - f.eks. den 20. januar. Når den er på plads, kan vi diskuttere videre.

Hvis formatet entydigt er mm/dd/yyyy, skal du bruge 101 i din convert (USA).
Hvis formatet entydigt er dd/mm/yyyy, skal du bruge 103 i din convert (British/French).
Avatar billede benneharli Juniormester
06. april 2006 - 08:58 #28
formatet er entydigt dd/mm/yyyy - det er mig der skriver datoerne ned i feltet med php, og tjekker via access bagefter, at det rent faktisk er det der bliver skrevet...
Avatar billede benneharli Juniormester
06. april 2006 - 09:02 #29
convert(datetime, Custom05, 103)

den ser ud til at virke ;-)
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