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

时间:2013-09-04 19:39:30

标签: sql sql-server sql-server-2008 tsql datetime

使用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

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

  

Msg 8117,Level 16,State 1,Line 1
  操作数数据类型日期对于添加运算符无效。

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

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

13 个答案:

答案 0 :(得分:36)

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

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

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

答案 1 :(得分:9)

将其转换为datetime

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

这适用于SQL Server 2008 R2。

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

答案 2 :(得分:7)

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

代码:

DECLARE @Date date = SYSDATETIME();

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

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

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

答案 3 :(得分:6)

简单的解决方案

times = [{"timefrom"=>10, "timeto"=>20},
         {"timefrom"=>12, "timeto"=>15},

         {"timefrom"=>22, "timeto"=>30},
         {"timefrom"=>28, "timeto"=>32},
         {"timefrom"=>29, "timeto"=>29},

         {"timefrom"=>32, "timeto"=>40},

         {"timefrom"=>42, "timeto"=>50},
         {"timefrom"=>43, "timeto"=>46}]

combine_times(times)
  #=> [{"timefrom"=>10, "timeto"=>20}, (combines times[0..1])
  #    {"timefrom"=>22, "timeto"=>32}, (combines times[2..4])
  #    {"timefrom"=>32, "timeto"=>40}, (times[5])
  #    {"timefrom"=>42, "timeto"=>50}] (combines times[6..7])

答案 4 :(得分:1)

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 :)]

这将为您提供有效的结果。

答案 5 :(得分:1)

解决方案(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倍,而且还保留了微秒部分。

有关solution (1) using date arithmeticsolution (2) involving string manipulation的信息,请参见SQL Fiddle。

答案 6 :(得分: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

答案 7 :(得分: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;

答案 8 :(得分: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)))

答案 9 :(得分:0)

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

select cast((myDate + ' ' + myTime) as datetime) from myTable

答案 10 :(得分:0)

在MySQL中将一列的日期与另一列的时间相结合。

SELECT CONVERT(concat(CONVERT('dateColumn',DATE),' ',CONVERT('timeColumn', TIME)), DATETIME) AS 'formattedDate' FROM dbs.tableName;

答案 11 :(得分:-1)

SELECT CONVERT(DATETIME, CONVERT(CHAR(8), date, 112) + ' ' + CONVERT(CHAR(8), time, 108))
  FROM tablename

答案 12 :(得分:-4)

使用Concat Mysql具有此功能