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
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
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
deTime part
de su columna deDate
es siempre cero - y la
Date part
de su columnaTime
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