Newsgroup: it.comp.www.asp
Titolo: Ordinamento di un campo datetime

Ciao a tutti.
Ho il seguente problema (il db è SQL Server). In una query ho un ORDER BY
dataEvento, dove dataEvento è un campo datetime(8).
L'ordinamento avviene però interpretando la data come stringa e non come
data, ad esempio
08/08/2003
10/02/2003
18/07/2002
21/11/2001
29/03/2002
in pratica tutto quello che viene dopo il primo "/" viene ignorato, infatti
in un'ottica stringa servirebbe solo a discriminare eventuali giorni uguali.
Devo modificare la query per avere l'ordinamento giusto e non posso toccare
il db.
Ho pensato di ordinare per i campi che si ottengono estraendo le
sottostringhe giorno, mese e anno, ma non riesco a trovare la funzione
sottostringa in SQL Server.
Grazie in anticipo a tutti.
Bye
giaconet

 ha scritto nel messaggio news:bq9qkd$1v04ka$2...@ID-71483.news.uni-berlin.de...

 Sicuro che non ti sta dando date in formato MM/GG/AAAA ?
Ma dagli esempi che ha fatto lui sembra che non tenga conto neanche 
dell'anno.
Per Giaconet:
Sicuro sicuro che si tratti di un campo datetime?
Non è che c'è un CAST o CONVERT in char/varchar?
Provato a fare un'altra query, banalissima, magari da Query Analyzer?
Provato a fare tu, allora, un CAST o CONVERT in datetime?

 Grazie in anticipo a tutti.
Prego.
Ciao!
-- 
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://mvp.support.microsoft.com
http://italy.mvps.org

 in pratica tutto quello che viene dopo il primo "/" viene ignorato,
per forza che ti viene ignorato... con il formato data classico non puoi
farlo... dovresti convertire la data nel formato yyyymmgghhmmss :)
-- 
Lino Mari [mod - it.economia.e-commerce]
http://www.ebow.it
 - e-business on web!
http://www.dev2dev.it
 - La rete ha connesso nuove particelle - d2D004
Oggi, l'organigramma è fatto di link, non di gerarchie.
Il rispetto per la conoscenza vince su quello per l'autorità astratta.

 :)
Ciao Lino,
Come ho già indicato nel mio precedente post, se il data type utilizzato è
datetime o smalldatetime le date saranno registrate fisicamente come coppie
di interi, pertanto l'ordinamento sarà numerico e quindi indipendente dalla
"formattazione a video".
Esempio:
USE tempdb
GO
/* Creo la tabella dbo.Students */
CREATE TABLE dbo.Students(
StudentID int NOT NULL IDENTITY PRIMARY KEY,
FirstName varchar(10) NOT NULL,
LastName varchar(10) NOT NULL,
BirthDate datetime NOT NULL
)
GO
/* Inserisco qualche studente */
INSERT dbo.Students VALUES('Lorenzo', 'Benaglia', '19710612')
INSERT dbo.Students VALUES('Luca', 'Bianchi', '19731214')
INSERT dbo.Students VALUES('Gianluca', 'Hotz', '19710326')
INSERT dbo.Students VALUES('Andrea', 'Montanari', '19771105')
GO
/* Leggo le righe formattando le date come DD/MM/YYYY
** e ordinando il result set in modo ascendente per
** la colonna datetime BirthDate
*/
SELECT StudentID, FirstName, LastName,
       CONVERT(char(10), BirthDate, 103) BirthdateFormatted
FROM dbo.Students
ORDER BY BirthDate
GO
/* Output
StudentID   FirstName  LastName   BirthdateFormatted
----------- ---------- ---------- ------------------ 
3           Gianluca   Hotz       26/03/1971
1           Lorenzo    Benaglia   12/06/1971
2           Luca       Bianchi    14/12/1973
4           Andrea     Montanari  05/11/1977
(4 row(s) affected)
*/
/* Leggo le righe formattando le date come DD/MM/YYYY
** e ordinando il result set in modo ascendente per
** la colonna char(10) BirthdateFormatted
*/
SELECT StudentID, FirstName, LastName,
       CONVERT(char(10), BirthDate, 103) BirthdateFormatted
FROM dbo.Students
ORDER BY BirthdateFormatted
GO
/* Output
StudentID   FirstName  LastName   BirthdateFormatted
----------- ---------- ---------- ------------------ 
4           Andrea     Montanari  05/11/1977
1           Lorenzo    Benaglia   12/06/1971
2           Luca       Bianchi    14/12/1973
3           Gianluca   Hotz       26/03/1971
(4 row(s) affected)
*/
/* Pulizia */
DROP TABLE dbo.Students
Per maggiori informazioni leggi il seguente tip:
http://italy.mvps.org/MVPs/lbenaglia/LorenzoBenaglia-Tip-FormatoDate.htm
Ciao!


 numerico e quindi indipendente dalla "formattazione a video".
ma infatti... non intendevo una formattazione a video... ma in pratica fare
un convert in stringa che sia composto con YYYYMMGG... in questo modo
l'order e' esattamente per data...


 in questo modo l'order e' esattamente per data...
Ciao Lino,
quello che scrivi è corretto, ma se il datatype utilizzato per memorizzare
le informazioni datetime è char o varchar è *ASSOLUTAMENTE* consigliabile
rivedere la struttura del db per non incorrere in problemi di consistenza
dei dati, di semplicità nei calcoli (pensa a tutte le funzioni datetime
disponibili in SQL Server) e di performance...
Perché dovrei utilizzare una stringa per memorizzare delle date? Nessuno
ricorda cosa è successo 3 anni fa (Y2K)? Ci sono 2 datatypes ad-hoc,
usiamoli! :-)


 Server) e di performance...
chi ha mai detto che il campo dovesse essere dioverso dal datetime o
smalldatetime... quello che intendevo io era solo un CONVERT nella query
solo per ordinare... e non credo possa portare alcun problema...
al limite si puo' convertire *nella query* il formato data in uno di quelli
disponibili formattati in questo modo yyyymmgghhMMss...
Ciao



Moderatore di it.comp.www.asp - Microsoft .NET MVP
http://www.aspitalia.com/
 Enjoy the .NET community!
http://www.dev2dev.it/
 La rete ha connesso nuove particelle!
http://www.extensible.it/
 XML and beyond

 query solo per ordinare... e non credo possa portare alcun problema...
Ciao Lino,
se la colonna che contiene la data è definita utilizzando il data type
datetime o smalldatetime non c'è bisogno di effettuare alcun cast per
effettuare l'ordinamento come ho avuto modo di dimostrare in una precedente
risposta.
Un cast comporta sempre un overhead (seppur minimo).


 anzi, magari ad averli :D
:-)
Eventualmente li avremmo il 1° gennaio 10000 :D


 Eventualmente li avremmo il 1° gennaio 10000 :D
ah, mi spiace, io ho già prenotato le vacanze per allora :P
