在我正在处理的摘录中,我有两个datetime
列。一列存储日期,另一列存储时间,如下所示。
如何查询该表以将这两个字段合并为1个datetime
类型的列
日期
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
发布于 2009-03-31 08:54:03
您可以简单地将这两个相加。
Date
列的Time part
始终为零,Date part
列的Time
也始终为零(基准日期:1900年1月1日)将它们相加将返回正确的结果。
SELECT Combined = MyDate + MyTime FROM MyTable
基本原理(kudos to ErikE/dnolan)
它的工作原理是这样的,因为日期被存储为两个4字节的Integers
,左边4个字节是date
,右边4个字节是time
。这就像做$0001 0000 + $0000 0001 = $0001 0001
一样
编辑有关新的SQL Server 2008类型
Date
和Time
是SQL Server 2008
中引入的类型。如果您坚持要添加,您可以使用Combined = CAST(MyDate AS DATETIME) + CAST(MyTime AS DATETIME)
关于SQL Server2008和更高版本中的精度损失的Edit2 (马丁·史密斯的荣誉)
了解一下使用SQL Server2008及更高版本时防止精度损失的How to combine date and time to datetime2 in SQL Server?。
发布于 2009-03-31 08:53:34
如果date列的time元素和time列的date元素都为零,那么就需要Lieven's answer。如果你不能保证情况总是如此,那么它就会变得稍微复杂一些:
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
发布于 2011-11-30 23:58:41
这是一个不需要任何字符转换的替代解决方案:
DATEADD(ms, DATEDIFF(ms, '00:00:00', [Time]), CONVERT(DATETIME, [Date]))
用这种方法你只能得到毫秒级的精度,但这通常是可以的。我已经在SQL Server 2008中对此进行了测试。
https://stackoverflow.com/questions/700619
复制相似问题