如何从SQL中的DateTime列中减去时间列?

时间:2015-01-22 14:23:21

标签: sql sql-server datetime time subtraction

我的Crea_Date列是DateTime列。我想从IST列中减去crea_date列中的值,然后返回一个包含DateTime值的新列。我的样本数据是这样的:

States  crea_date               IST
AB      2014-12-30 15:01:00.000 12:30:00.0000000
AK      2014-12-29 16:32:00.000 10:30:00.0000000
AZ      2014-12-18 16:07:00.000 11:30:00.0000000

先谢谢

4 个答案:

答案 0 :(得分:3)

看起来很奇怪,你可以添加/减去datetime值,这似乎是“正常”行为。

在内部,日期时间值存储为1/1/1900的偏移量。如果我添加22/1/20151/1/2015,我会获得22/1/2130,因为第二个值实际上是115之后的1900年。

当您将time值转换为datetime时,仅复制时间组件并将日期组件设置为1/1/1900。实际上,您的间隔等于原始时间值。

这样我可以从特定日期时间减去10:30小时:

declare @d datetime='2014-11-04 12:51:00', @t time='10:30:00'
select @d -cast(@t as datetime)

//-----------------------
//2014-11-04 02:21:00.000

此行为不是实现怪癖 - 仅明确允许datetime类型。所有其他日期时间类型(例如datetime2,datetimeoffset)都返回错误Operand data type datetimeoffset is invalid for subtract operator

答案 1 :(得分:0)

如果IST是整数秒:

SELECT DATEADD(s, -IST, crea_date)
FROM yourTable

如果IST属于TIME类型:

SELECT DATEADD(ms, DATEDIFF(ms, IST, '00:00:00'), crea_date)
FROM yourTable

答案 2 :(得分:0)

如果IST是基于字符的列,请尝试以下操作。

SELECT  
Crea_Date, IST,
dateadd(hh,cast(substring(IST,1,2) as int),  
    dateadd(mi, cast(substring(IST, 4,2) as int), 
             dateadd(s, cast(substring(IST,7,2 ) as int), crea_date)
             )) Final_Date
from [Yourtable]

您将在Final_Date列中获得添加的日期。

答案 3 :(得分:0)

在@ 0xF稍作修改后,我找到了最终解决方案:

convert(varchar(10),
DATEADD(ms, DATEDIFF(ms, '00:00:00', IST), crea_date), 101) + right(convert(varchar(32
DATEADD(ms, DATEDIFF(ms, '00:00:00', IST), crea_date),100),8)