将日期和时间组合(连接)到日期时间

Sta*_*ton 24 sql t-sql sql-server datetime sql-server-2008

使用SQL Server 2008,此查询非常有用:

select CAST(CollectionDate as DATE), CAST(CollectionTime as TIME)
from field
Run Code Online (Sandbox Code Playgroud)

给我两个这样的列:

2013-01-25  18:53:00.0000000
2013-01-25  18:53:00.0000000
2013-01-25  18:53:00.0000000
2013-01-25  18:53:00.0000000
    .
    .
    .
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用加号将它们组合成单个日期时间,如下所示:

select CAST(CollectionDate as DATE) + CAST(CollectionTime as TIME)
from field
Run Code Online (Sandbox Code Playgroud)

我查看了大约十个网站,包括这个网站上的答案(就像这个),他们似乎都同意加号应该有效,但我收到错误:

消息8117,级别16,状态1,行1
操作数数据类型日期对于添加运算符无效.

所有字段都是非零且非空.我也尝试过CONVERT函数并尝试将这些结果转换为varchars,同样的问题.这不会像我做的那么难.

有人可以告诉我为什么这不起作用?谢谢你的帮助.

Aar*_*and 38

假设基础数据类型是日期/时间/日期时间等.

SELECT CONVERT(DATETIME, CONVERT(CHAR(8), CollectionDate, 112) 
  + ' ' + CONVERT(CHAR(8), CollectionTime, 108))
  FROM dbo.whatever;
Run Code Online (Sandbox Code Playgroud)

如果它们不是,为什么不是,为了获得有意义的答案,您需要告诉我们它们是什么类型以及存储数据的格式.或者只是修复表格.


小智 10

简单的解决方案

SELECT CAST(CollectionDate as DATETIME) + CAST(CollectionTime as DATETIME)
FROM field
Run Code Online (Sandbox Code Playgroud)

  • 哇 - 我认为这行不通。完美的! (2认同)

Amy*_*Amy 9

把它投射到datetime:

select CAST(CollectionDate as DATETIME) + CAST(CollectionTime as TIME)
from field
Run Code Online (Sandbox Code Playgroud)

这适用于SQL Server 2008 R2.

如果由于某种原因你想确保第一部分没有时间组件,首先将该字段转换为日期,然后再返回datetime.

  • 确实.我建议接受@ AaronBertrand的回答.我的答案要么现在有缺陷,要么很快就会有缺陷.(接受的答案可以改变吗?我从未尝试过.) (3认同)
  • `消息402,级别16,状态1,行1 - 数据类型日期时间和时间在添加运算符中不兼容. (2认同)

小智 7

一个更简单的解决方案(在SQL Server 2014 SP1 CU6上测试)

码:

DECLARE @Date date = SYSDATETIME();

DECLARE @Time time(0) = SYSDATETIME();

SELECT CAST(CONCAT(@Date, ' ', @Time) AS datetime2(0));
Run Code Online (Sandbox Code Playgroud)

在给定具有特定日期和特定时间字段的表的情况下,这也将起作用.我经常使用这种方法,因为我们的供应商数据在两个单独的字段中使用日期和时间.