tipo operaciones fechas fecha entre ejemplo diferencia dato convertir con cast sql sql-server datetime

operaciones - Cómo combinar la fecha de un campo con el tiempo de otro campo-Servidor MS SQL



sql string to int (13)

En un extracto que estoy tratando, tengo 2 columnas de datetime . Una columna almacena las fechas y otra las veces como se muestra.

¿Cómo puedo consultar la tabla para combinar estos dos campos en 1 columna de tipo datetime ?

fechas

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

Veces

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


  1. Si ambos campos son de fecha y hora, simplemente agregarlos funcionará.

    p.ej:

    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. Si usó el tipo de datos de fecha y hora, simplemente envíe el tiempo a datetime

    p.ej:

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


Convierta ambos campos en DATETIME:

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

y si está usando Getdate() use esto primero:

DECLARE @FechaActual DATETIME = CONVERT(DATE, GETDATE()); SELECT CAST(@FechaActual as DATETIME) + CAST(@HoraInicioTurno AS DATETIME)


Convierta la primera fecha almacenada en un campo de fecha y hora en una cadena, luego convierta el tiempo almacenado en un campo de fecha y hora en una cadena, añádalos y conviértelos de nuevo a un campo de fecha y hora utilizando formatos de conversión conocidos.

Convert(datetime, Convert(char(10), MYDATETIMEFIELD, 103) + '' '' + Convert(char(8), MYTIMEFIELD, 108), 103)


Esta es una solución alternativa sin conversiones de char:

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

Solo obtendrá una precisión de milisegundos de esta manera, pero eso normalmente estaría bien. Lo he probado en SQL Server 2008.


Esto funcionó para mí

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

(en SQL 2008 R2)


Para combinar la fecha de una columna de fecha y hora desde otra columna de fecha y hora, esta es la mejor solución más rápida para usted:

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


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


Si el elemento de tiempo de su columna de fecha y el elemento de fecha de su columna de hora son ambos cero, entonces la respuesta de Lieven es lo que necesita. Si no puede garantizar que siempre será el caso, entonces se vuelve un poco más complicado:

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


Si no está utilizando SQL Server 2008 (es decir, solo tiene un tipo de datos DateTime), puede usar el siguiente (ciertamente rudo y listo) TSQL para lograr lo que desea:

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)

Es áspero y listo, ¡pero funciona!


Simplemente puede agregar los dos.

  • si la Time part de Time part de su columna de Date es siempre cero
  • y la Date part de su columna Time también es siempre cero (fecha base: 1 de enero de 1900)

Sumarlos devuelve el resultado correcto.

SELECT Combined = MyDate + MyTime FROM MyTable

Justificación (felicitaciones 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

Editar con respecto a los nuevos tipos de SQL Server 2008

Date y Time son tipos introducidos en SQL Server 2008 . Si insiste en agregar, puede usar Combined = CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)

Edit2 con respecto a la pérdida de precisión en SQL Server 2008 y versiones posteriores (felicitaciones a Martin Smith)

Eche un vistazo a Cómo combinar la fecha y la hora con datetime2 en SQL Server? para evitar la pérdida de precisión usando SQL Server 2008 en adelante.


Tuve muchos errores como se indicó anteriormente, así que lo hice así

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

Funcionó para mí


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

Huellas dactilares:

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


SELECT CAST(your_date_column AS date) + CAST(your_time_column AS datetime) FROM your_table

Funciona de maravilla