如何将一个字段的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
Date
和Time
是在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)
这是粗糙和准备,但它的作品!
-
如果两个字段都是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
-
如果您使用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