使用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,同样的问题。这不会像我做的那么难。
有人可以告诉我为什么这不起作用?谢谢你的帮助。
答案 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 arithmetic与solution (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,并且myDate
和myTime
字段都是字符串。下面的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具有此功能