2016-07-22 75 views
0

在SQL Server 2005中,我正在询问一些旧的遗留数据,并且需要将datetime列的日期组件与另一列中的时间组件组合。这里有一个例子:SQL Server - 将DATETIME的DATE部分添加到DATETIME的TIME部分

DateColumn: 2016-05-09 00:00:00.000 
TimeColumn: 1899-12-30 12:26:00.000 

我需要转换为以下日期时间的最终结果是:

ResultDateTime: 2016-05-09 12:26:00.000 

我尝试使用:

CAST(DateColumn AS DATETIME) + CAST(TimeColumn AS TIME) AS ResultDateTime 

但是SQL Server 2005不识别的类型时间。

有人可以告诉我一种方法吗?

非常感谢!

+1

'dateadd(ss,datediff(ss,'18991230'' –

回答

2

你可以只使用DATEADDDATEDIFF,假设时间列的日期部分总是30/12/1899 :

declare @t table (DateColumn datetime,TimeColumn datetime) 
insert into @t(DateColumn,TimeColumn) values 
('2016-05-09T00:00:00.000','1899-12-30T12:26:00.000') 

select DATEADD(millisecond,DATEDIFF(millisecond,'18991230',TimeColumn),DateColumn) 
from @t 

结果:

----------------------- 
2016-05-09 12:26:00.000 
+0

这个答案帮助,谢谢! – user2430797

2

时间列转换为字符串HH:MM:SS,并添加到日期列

ResultDatetIme = DateColumn + convert(varchar(10), TimeColumn, 108) 
1

正如你可以看到SQL 2005中支持的以下数据类型: https://msdn.microsoft.com/en-us/library/ms187819(v=sql.90).aspx

使用datetime和smalldatetime,smalldatetime数据类型存储的日期和日期的时间精度不如datetime。数据库引擎将smalldatetime值存储为两个2字节整数。前两个字节存储1900年1月1日以后的天数。其他2个字节存储自午夜以来的分钟数。 日期时间值被四舍五入为.000,.003或.007秒的增量,如下表所示。

SELECT CAST('2016-05-09 00:00:00.000' AS DATETIME) + CAST('1900-01-01 12:26:00.000' AS smalldatetime) AS ResultDateTime 
Result: 2016-05-09 12:26:00.000 

因此,您可以使用datetime和smalldatetime,希望完全可以为您工作。 让我知道是否有问题。爱解决:)

+0

我试过了,它返回:从datetime数据类型转换为smalldatetime数据类型导致smalldatetime溢出错误 – user2430797

+1

这将工作,因为1900年以下是错误原因 SELECT CAST('2016-05-09 00:00:00.000'AS DATETIME)+ CAST('1900-01-01 12:26:00.000' AS smalldatetime)AS Result日期时间 – khawarPK

+0

This工作: SELECT CAST('2016-05-09 00:00:00.000'AS DATETIME)+ CAST('1900-01-01 12:26:00.000'AS smalldatetime)AS ResultDateTime –