在我正在处理的提取中,我有2个datetime列。一列存储日期,另一列存储如下所示的时间。
如何查询表,将这两个字段组合成类型为datetime的1列?
日期
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
在我正在处理的提取中,我有2个datetime列。一列存储日期,另一列存储如下所示的时间。
如何查询表,将这两个字段组合成类型为datetime的1列?
日期
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
当前回答
现有的答案不解决datetime2数据类型,所以我将添加我的:
假设你想添加一个时间值到datetime2值,其中:
datetime2值可以包含非零时间分量和/或小数秒 时间值可以包含值23:59:59.9999999,即86,399.9999999秒,86,399,999,999.9微秒或86,399,999,999,900纳秒¹
由于dateadd函数¹的限制,您必须分两步添加它们:
将时间值转换为秒并使用dateadd(second,…) 从时间值中提取纳秒,并使用dateadd(nanosecond,…)将它们添加到上面计算的日期中
declare @dv datetime2 = '2000-01-01 12:34:56.7890123';
declare @tv time = '23:59:59.9999999';
select dateadd(
nanosecond,
datepart(nanosecond, @tv),
dateadd(
second,
datepart(hour, @tv) * 60 * 60 + datepart(minute, @tv) * 60 + datepart(second, @tv),
@dv
)
);
-- 2000-01-02 12:34:56.7890122
¹纳秒值可能不适合dateadd函数期望的int数据类型。
其他回答
如果两个字段都是datetime,那么简单地添加它们就可以了。 例如: 声明@d datetime, @t datetime Set @d = '2009-03-12 00:00:00.000'; Set @t = ' 189-12-30 12:30:00.000'; 选择@d + @t 如果您使用Date & Time数据类型,则只需将时间转换为datetime 例如: 声明@d日期,@t时间 Set @d = '2009-03-12'; Set @t = '12:30:00.000'; 选择@d + cast(@t as datetime)
select s.SalesID from SalesTbl s
where cast(cast(s.SaleDate as date) as datetime) + cast(cast(s.SaleCreatedDate as time) as datetime) between @FromDate and @ToDate
如上所述,我有很多错误,所以我这样做
try_parse(concat(convert(date,Arrival_date),' ',arrival_time) as datetime) AS ArrivalDateTime
这对我很管用。
SELECT CAST(your_date_column AS date) + CAST(your_time_column AS datetime) FROM your_table
效果非常好
另一种方法是使用CONCATand CAST,请注意,需要使用DATETIME2(x)才能使其工作。你可以将x设置为0- 7,7之间的任何值,这意味着没有精度损失。
DECLARE @date date = '2018-03-12'
DECLARE @time time = '07:00:00.0000000'
SELECT CAST(CONCAT(@date, ' ', @time) AS DATETIME2(7))
返回2018-03-12 07:00:00.0000000
在SQL Server 14上测试