如何将一个字段的date与另一个字段的时间结合起来 – MS SQL Server

在我正在处理的摘录中,我有2个datetime列。 一列存储date和另一个时间如图所示。

我怎样才能查询表将这两个字段组合成1types的datetime

date

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

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

你可以简单地添加这两个。

  • 如果 Date列的Time part始终为零
  • 并且Time列的“ Date part也始终为零(基准date:1900年1月1日)

添加它们会返回正确的结果。

 SELECT Combined = MyDate + MyTime FROM MyTable 

理由(荣誉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 

编辑有关新的SQL Server 2008types

DateTime是在SQL Server 2008引入的types。 如果你坚持添加,你可以使用Combined = CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)

Edit2关于在SQL Server 2008及以上的精度损失(马丁史密斯荣誉)

看看如何将date和时间结合到SQL Server中的datetime2? 以防止使用SQL Server 2008和以上的精度损失。

如果date列的时间元素和时间列的date元素都是零,那么列文的答案就是你所需要的。 如果你不能保证永远是这样,那么它会变得稍微复杂一些:

 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 

这是一个没有任何字符转换的替代解决scheme:

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

这样你将只能得到毫秒级的精度,但通常情况下还是可以的。 我已经在SQL Server 2008中testing过了。

这对我有效

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

(在SQL 2008 R2上)

如果你没有使用SQL Server 2008(也就是你只有一个DateTime数据types),你可以使用以下(确实粗糙和准备好的)TSQL来实现你想要的:

 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) 

这是粗糙和准备,但它的作品!

  1. 如果两个字段都是date时间,那么简单地添加这些就行了。

    例如:

     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. 如果您使用date和时间数据types,那么只需要把时间转换为date时间

    例如:

     Declare @d date, @t time set @d = '2009-03-12'; set @t = '12:30:00.000'; select @d + cast(@t as datetime) 
 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 

打印:

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

将这两个字段转换为DATETIME:

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

如果你使用Getdate()首先使用这个:

 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 

奇迹般有效

将存储在date时间字段中的第一个date转换为string,然后将存储在date时间字段中的时间转换为string,将其附加到date时间字段,并使用已知的转换格式转换回date时间字段。

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

我有很多错误,如上所述,所以我这样做

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

它为我工作。

要结合date时间列的date和另一个date时间列的时间,这是最适合您的最快速的解决scheme:

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