Confronto fra date e conversione in datetime

giovedì 11 maggio 2006 - 14.56

escaflowne Profilo | Junior Member

Ciao a tutti,
è una domanda stupida ma mi sono un po' perso.
Dunque, ho 5 campi int che rappresentano nell'ordine:
anno, mese, giorno, ora, minuti

vorrei convertire i 5 campi in datetime e confrontarla con la data attuale ma ho problemi. Come fare?
Pensavo a
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

e poi usare il dateDiff con CURRENT_TIMESTAMP
ma mi da errore nel tentativo di conversione di / in int (???)

Potreste farmi un esempio?
Grazie

lbenaglia Profilo | Guru

>Pensavo a
>convert(datetime, anno + '/' + mese + '/' + giorno + ' ' + ora
>+ ':' + minuti) as dataApp
>
>e poi usare il dateDiff con CURRENT_TIMESTAMP

Ciao escaflowne,

perché non utilizzare il formato ISO ANSI SQL-92 (quindi una stringa 'YYYYMMDD hh:mm') ?
Guarda il seguente esempio:

USE tempdb; GO CREATE TABLE dbo.myDates( DateID int NOT NULL IDENTITY PRIMARY KEY, Anno int NOT NULL, Mese int NOT NULL, Giorno int NOT NULL, Ora int NOT NULL, Minuti int NOT NULL ); GO INSERT dbo.myDates VALUES(1971, 6, 12, 12, 5); INSERT dbo.myDates VALUES(2006, 5, 11, 15, 2); INSERT dbo.myDates VALUES(1943, 11, 3, 8, 32); GO WITH myCTE (myDate) AS ( SELECT CAST(Anno AS char(4)) + -- Anno RIGHT('00' + CAST(Mese AS varchar(2)), 2) + -- Mese RIGHT('00' + CAST(Giorno AS varchar(2)), 2) + ' ' + -- Giorno RIGHT('00' + CAST(Ora AS varchar(2)), 2) + ':' + -- Ora RIGHT('00' + CAST(Minuti AS varchar(2)), 2) -- Minuti FROM dbo.myDates ) SELECT myDate , CAST(myDate AS smalldatetime) AS mySmalldatetime , DATEDIFF(day, myDate, CURRENT_TIMESTAMP) AS DiffDays FROM myCTE; GO /* Output: myDate mySmalldatetime DiffDays -------------- ----------------------- ----------- 19710612 12:05 1971-06-12 12:05:00 12752 20060511 15:02 2006-05-11 15:02:00 0 19431103 08:32 1943-11-03 08:32:00 22835 (3 row(s) affected) */ DROP TABLE dbo.myDates;

Come puoi vedere ho definito per comodità una Common Table Expression (CTE) in SQL Server 2005 (sostituibile se vuoi con una vista) dove concateno le colonne in una stringa nel formato 'YYYYMMDD hh:mm'.
Questa stringa verrà implicitamente castata a datetime ogni volta che tenterai di eseguire un calcolo (come ad esempio applicando la funzione DATEDIFF()).

Per ulteriori dettagli consulta i Books Online.

>Grazie
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

alx_81 Profilo | Guru

ciao!

select cast(cast(anno as varchar(4)) + '-' +
right('00' + cast(mese as varchar(2)),2) + '-' +
right('00' + cast(giorno as varchar(2)),2) + ' ' +
cast(ore as varchar(2)) + ':' +
cast(minuti as varchar(2)) + ':' +
cast(secondi as varchar(2)) as datetime)
from TuaTabella

ho convertito in stringa tutti gli int e li ho riuniti in un formato ISO, poi li riconverto a dateeime.

Alx81 =)

http://blogs.dotnethell.it/suxstellino

escaflowne Profilo | Junior Member

ottimo,
mi studio ambedue gli esempi. Grazie

alx_81 Profilo | Guru

Guarda quello di lbenaglia se hai sql serever 2005, che ci sono anche le CTE!! =)
ciao!



Alx81 =)

http://blogs.dotnethell.it/suxstellino
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5