我的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
先谢谢
答案 0 :(得分:3)
看起来很奇怪,你可以添加/减去datetime
值,这似乎是“正常”行为。
在内部,日期时间值存储为1/1/1900
的偏移量。如果我添加22/1/2015
和1/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)