如何从 SQL 中的日期时间列中减去时间列?
How to subtract Time Column from DateTime Column in SQL?
我有 Crea_Date
列,这是一个 DateTime
列。我想从 crea_date
列中减去 IST
列中的值,并 return 一个包含 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
提前致谢
如果IST
是秒的整数:
SELECT DATEADD(s, -IST, crea_date)
FROM yourTable
如果IST
属于TIME
类型:
SELECT DATEADD(ms, DATEDIFF(ms, IST, '00:00:00'), crea_date)
FROM yourTable
如果 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
列中获得添加日期。
对@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)
虽然看起来很奇怪,但您 可以 add/subtract datetime
值,这似乎是 "normal" 行为。
在内部,日期时间值存储为 1/1/1900
的偏移量。如果我添加 22/1/2015
和 1/1/2015
我得到 22/1/2130
因为第二个值实际上是 1900
.
之后的 115
年
当您将 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)return 错误 Operand data type datetimeoffset is invalid for subtract operator
.
我有 Crea_Date
列,这是一个 DateTime
列。我想从 crea_date
列中减去 IST
列中的值,并 return 一个包含 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
提前致谢
如果IST
是秒的整数:
SELECT DATEADD(s, -IST, crea_date)
FROM yourTable
如果IST
属于TIME
类型:
SELECT DATEADD(ms, DATEDIFF(ms, IST, '00:00:00'), crea_date)
FROM yourTable
如果 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
列中获得添加日期。
对@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)
虽然看起来很奇怪,但您 可以 add/subtract datetime
值,这似乎是 "normal" 行为。
在内部,日期时间值存储为 1/1/1900
的偏移量。如果我添加 22/1/2015
和 1/1/2015
我得到 22/1/2130
因为第二个值实际上是 1900
.
115
年
当您将 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)return 错误 Operand data type datetimeoffset is invalid for subtract operator
.