Come combinare la data da un campo con il tempo da un altro campo – MS SQL Server

In un estratto con cui ho a che fare, ho 2 colonne datetime . Una colonna memorizza le date e un’altra le volte come mostrato.

Come posso interrogare la tabella per combinare questi due campi in 1 colonna di tipo datetime ?

Date

 2009-03-12 00:00:00.000 2009-03-26 00:00:00.000 2009-03-26 00:00:00.000 

Volte

 1899-12-30 12:30:00.000 1899-12-30 10:00:00.000 1899-12-30 10:00:00.000 

Puoi semplicemente aggiungere i due.

  • se la Time part della colonna Date è sempre zero
  • e la Date part della colonna Time è sempre zero (data base: 1 gennaio 1900)

Aggiungendoli restituisce il risultato corretto.

 SELECT Combined = MyDate + MyTime FROM MyTable 

Motivazione (complimenti a ErikE / dnolan)

 It works like this due to the way the date is stored as two 4-byte `Integers` with the left 4-bytes being the `date` and the right 4-bytes being the `time`. Its like doing $0001 0000 + $0000 0001 = $0001 0001 

Modifica relativa ai nuovi tipi di SQL Server 2008

Date e Time sono tipi introdotti in SQL Server 2008 . Se insisti ad aggiungere, puoi usare Combined = CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)

Modifica2 per quanto riguarda la perdita di precisione in SQL Server 2008 e versioni successive (complimenti a Martin Smith)

Dai un’occhiata a Come combinare data e ora con datetime2 in SQL Server? per evitare perdite di precisione con SQL Server 2008 e versioni successive.

Se l’elemento temporale della colonna della data e l’elemento della data della colonna del tempo sono entrambi pari a zero, la risposta di Lieven è ciò di cui hai bisogno. Se non puoi garantire che sarà sempre così, allora sarà leggermente più complicato:

 SELECT DATEADD(day, 0, DATEDIFF(day, 0, your_date_column)) + DATEADD(day, 0 - DATEDIFF(day, 0, your_time_column), your_time_column) FROM your_table 

Questa è una soluzione alternativa senza conversioni char:

 DATEADD(ms, DATEDIFF(ms, '00:00:00', [Time]), CONVERT(DATETIME, [Date])) 

Otterrai la precisione in millisecondi solo in questo modo, ma normalmente sarebbe OK. Ho provato questo in SQL Server 2008.

Questo ha funzionato per me

 CAST(Tbl.date as DATETIME) + CAST(Tbl.TimeFrom AS TIME) 

(su SQL 2008 R2)

Se non si utilizza SQL Server 2008 (ovvero si dispone solo di un tipo di dati DateTime), è ansible utilizzare il seguente TSQL (sicuramente approssimativo e pronto) per ottenere ciò che si desidera:

 DECLARE @DateOnly AS datetime DECLARE @TimeOnly AS datetime SET @DateOnly = '07 aug 2009 00:00:00' SET @TimeOnly = '01 jan 1899 10:11:23' -- Gives Date Only. SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @DateOnly)) -- Gives Time Only. SELECT DATEADD(Day, -DATEDIFF(Day, 0, @TimeOnly), @TimeOnly) -- Concatenates Date and Time parts. SELECT CAST( DATEADD(dd, 0, DATEDIFF(dd, 0, @DateOnly)) + ' ' + DATEADD(Day, -DATEDIFF(Day, 0, @TimeOnly), @TimeOnly) as datetime) 

È rozzo e pronto, ma funziona!

  1. Se entrambi i campi sono datetime, aggiungere semplicemente quelli funzionerà.

    per esempio:

     Declare @d datetime, @t datetime set @d = '2009-03-12 00:00:00.000'; set @t = '1899-12-30 12:30:00.000'; select @d + @t 
  2. Se si è utilizzato il tipo di dati Data e ora, impostare l’ora in data / ora

    per esempio:

     Declare @d date, @t time set @d = '2009-03-12'; set @t = '12:30:00.000'; select @d + cast(@t as datetime) 

Convertire la prima data memorizzata in un campo datetime in una stringa, quindi convertire il tempo memorizzato in un campo datetime in stringa, aggiungere i due e riconvertire in un campo datetime utilizzando tutti i formati di conversione noti.

 Convert(datetime, Convert(char(10), MYDATETIMEFIELD, 103) + ' ' + Convert(char(8), MYTIMEFIELD, 108), 103) 
 DECLARE @Dates table ([Date] datetime); DECLARE @Times table ([Time] datetime); INSERT INTO @Dates VALUES('2009-03-12 00:00:00.000'); INSERT INTO @Dates VALUES('2009-03-26 00:00:00.000'); INSERT INTO @Dates VALUES('2009-03-30 00:00:00.000'); INSERT INTO @Times VALUES('1899-12-30 12:30:00.000'); INSERT INTO @Times VALUES('1899-12-30 10:00:00.000'); INSERT INTO @Times VALUES('1899-12-30 10:00:00.000'); WITH Dates (ID, [Date]) AS ( SELECT ROW_NUMBER() OVER (ORDER BY [Date]), [Date] FROM @Dates ), Times (ID, [Time]) AS ( SELECT ROW_NUMBER() OVER (ORDER BY [Time]), [Time] FROM @Times ) SELECT Dates.[Date] + Times.[Time] FROM Dates JOIN Times ON Times.ID = Dates.ID 

stampe:

 2009-03-12 10:00:00.000 2009-03-26 10:00:00.000 2009-03-30 12:30:00.000 

Ho avuto molti errori come detto sopra, quindi l’ho fatto in questo modo

 try_parse(concat(convert(date,Arrival_date),' ',arrival_time) as datetime) AS ArrivalDateTime 

Ha funzionato per me.

Converti entrambi i campi in DATETIME:

 SELECT CAST(@DateField as DATETIME) + CAST(@TimeField AS DATETIME) 

e se stai usando Getdate() usa questo primo:

 DECLARE @FechaActual DATETIME = CONVERT(DATE, GETDATE()); SELECT CAST(@FechaActual as DATETIME) + CAST(@HoraInicioTurno AS DATETIME) 
 SELECT CAST(your_date_column AS date) + CAST(your_time_column AS datetime) FROM your_table 

Funziona come un fascino

Per combinare la data da una colonna datetime e l’ora da un’altra colonna datetime, questa è la soluzione più veloce per te:

 select cast(cast(DateColumn as date) as datetime) + cast(TimeColumn as datetime) from YourTable 

SELECT CAST (CAST (@DateField As Date) As DateTime) + CAST (CAST (@TimeField As Time) As DateTime)