31

使用 SQL Server 2008,此查询效果很好:

select CAST(CollectionDate as DATE), CAST(CollectionTime as TIME)
from field

给我这样的两列:

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
    .
    .
    .

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

select CAST(CollectionDate as DATE) + CAST(CollectionTime as TIME)
from field

我查看了大约十个网站,包括这个网站上的答案(比如这个),他们似乎都同意加号应该可以工作,但我得到了错误:

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

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

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

4

12 回答 12

58

假设底层数据类型是日期/时间/日期时间类型:

SELECT CONVERT(DATETIME, CONVERT(CHAR(8), CollectionDate, 112) 
  + ' ' + CONVERT(CHAR(8), CollectionTime, 108))
  FROM dbo.whatever;

这会将CollectionDateand转换CollectionTime为 char 序列,组合它们,然后将它们转换为datetime.

的参数CONVERTdata_typeexpression可选的style(参见语法文档)。

日期和时间style112转换为 ISO格式yyyymmddstyle108转换为hh:mi:ss格式。显然两者都是 8 个字符长,这就是为什么两者data_typeCHAR(8)适用。

生成的组合字符序列采用格式yyyymmdd hh:mi:ss,然后转换为datetime.

于 2013-09-04T19:47:19.113 回答
16

简单的解决方案

SELECT CAST(CollectionDate as DATETIME) + CAST(CollectionTime as DATETIME)
FROM field
于 2016-07-19T20:00:16.230 回答
10

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

代码:

DECLARE @Date date = SYSDATETIME();

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

SELECT CAST(CONCAT(@Date, ' ', @Time) AS datetime2(0));

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

于 2016-06-08T19:32:09.230 回答
8

改为datetime

select CAST(CollectionDate as DATETIME) + CAST(CollectionTime as TIME)
from field

这适用于 SQL Server 2008 R2。

如果出于某种原因您想确保第一部分没有时间组件,请先将该字段转换为 date,然后再转换为datetime.

于 2013-09-04T19:47:50.570 回答
2
DECLARE @ADate Date, @ATime Time, @ADateTime Datetime

SELECT @ADate = '2010-02-20', @ATime = '18:53:00.0000000'

SET @ADateTime = CAST   (
    CONVERT(Varchar(10), @ADate, 112) + ' ' +   
    CONVERT(Varchar(8), @ATime) AS DateTime)

SELECT @ADateTime [A nice datetime :)]

这将为您呈现一个有效的结果。

于 2013-09-04T19:58:42.270 回答
2

解决方案(1):日期时间算术

给定@myDate,它可以是任何可以转换为 DATE 的东西,@myTime,它可以是任何可以转换为 TIME 的东西,从 SQL Server 2014+ 开始,这可以正常工作并且不涉及字符串操作:

CAST(CAST(@myDate as DATE) AS DATETIME) + CAST(CAST(@myTime as TIME) as DATETIME)

您可以通过以下方式进行验证:

SELECT  GETDATE(), 
        CAST(CAST(GETDATE() as DATE) AS DATETIME) + CAST(CAST(GETDATE() as TIME) as DATETIME)

解决方案(2):字符串操作

SELECT  GETDATE(), 
        CONVERT(DATETIME, CONVERT(CHAR(8), GETDATE(), 112) + ' ' + CONVERT(CHAR(8), GETDATE(), 108))

然而,解决方案 (1) 不仅比解决方案 (2) 快 2-3 倍,而且还保留了微秒部分。

有关使用日期算术的解决方案 (1)涉及字符串操作的解决方案 (2),请参见 SQL Fiddle

于 2020-01-26T19:01:05.820 回答
1

在 MySQL 中将一列的日期与另一列的时间连接起来。

SELECT CONVERT(concat(CONVERT('dateColumn',DATE),' ',CONVERT('timeColumn', TIME)), DATETIME) AS 'formattedDate' FROM dbs.tableName;
于 2020-02-17T05:46:13.773 回答
0

这适用于 SQL 2008 和 2012 以生成 datetime2:

declare @date date = current_timestamp;
declare @time time = current_timestamp;

select 
@date as date
,@time as time
,cast(@date as datetime) + cast(@time as datetime) as datetime
,cast(@time as datetime2) as timeAsDateTime2
,dateadd(dayofyear,datepart(dayofyear,@date) - 1,dateadd(year,datepart(year,@date) - 1900,cast(@time as datetime2))) as datetime2;
于 2014-02-20T00:40:41.260 回答
0
drop table test

create table test(
    CollectionDate date NULL,
    CollectionTime  [time](0) NULL,
    CollectionDateTime as (isnull(convert(datetime,CollectionDate)+convert(datetime,CollectionTime),CollectionDate))
-- if CollectionDate is datetime no need to convert it above
)

insert test (CollectionDate, CollectionTime)
values ('2013-12-10', '22:51:19.227'),
       ('2013-12-10', null),
       (null, '22:51:19.227')

select * from test

CollectionDate  CollectionTime  CollectionDateTime
2013-12-10      22:51:19        2013-12-10 22:51:19.000
2013-12-10      NULL            2013-12-10 00:00:00.000
NULL            22:51:19        NULL
于 2013-12-11T11:07:08.853 回答
0

处理日期,必须使用 dateadd 来保证精度

declare @a DATE = getdate()
declare @b time(7) = getdate()
select @b, @A, GETDATE(), DATEADD(day, DATEDIFF(day, 0, @a), cast(@b as datetime2(0)))
于 2019-04-01T06:49:32.523 回答
0

我正在使用 SQL Server 2016,并且myDatemyTime字段都是字符串。下面的 tsql 语句将它们连接成datetime

select cast((myDate + ' ' + myTime) as datetime) from myTable
于 2019-08-22T08:06:53.403 回答
-2
SELECT CONVERT(DATETIME, CONVERT(CHAR(8), date, 112) + ' ' + CONVERT(CHAR(8), time, 108))
  FROM tablename
于 2014-03-21T10:17:33.920 回答