【问题标题】:How to subtract Time Column from DateTime Column in SQL?如何从 SQL 中的 DateTime 列中减去时间列?
【发布时间】:2015-01-22 14:23:20
【问题描述】:

我有Crea_Date 列,这是一个DateTime 列。我想从crea_date 列中减去IST 列中的值,并返回一个包含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

提前致谢

【问题讨论】:

  • 您使用的是 SQL-Server、MySQL、Oracle 等哪个 RDBMS? IST 也是日期时间列吗?
  • @Sourav_Agasti,我正在使用 SQL-Server。

标签: sql sql-server datetime time subtraction


【解决方案1】:

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

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

当您将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

【讨论】:

  • 确实,SELECT crea_date - cast(IST as datetime) FROM yourTable 比我的解决方案更优雅。
  • 完全出乎意料。 IF ONLY SQL Server 有适当的间隔支持!
  • 我一直将间隔存储为纯 INT 秒数。直到现在才知道SQL Server 2008引入了TIME类型。
【解决方案2】:

如果IST 是整数秒:

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

如果IST 属于TIME 类型:

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

【讨论】:

  • 在尝试您的方法时,我收到错误消息:'Msg 8117, Level 16, State 1, Line 2 Operand data type time is invalid for minus operator.'
  • 编辑了我的答案,添加了TIME 类型的情况。您的问题的第一个版本并不清楚。
  • 您的回答符合我的目的。只需要一个小帮助!如何将新列中的数据设为“2014-12-31 03:31 PM”?
  • 第一行的结果是2014-12-30 02:31:00.000,所以我不知道您是要求将生成的日期时间转换为yyyy-mm-dd hh:mi AM 格式字符串还是进行一些调整?
  • @TheDProgrammer 日期没有格式,它们是二进制值。仅当应用程序将日期转换为字符串时,格式才适用,例如用于显示
【解决方案3】:

如果 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 列中获得添加的日期。

【讨论】:

  • 对不起,我忘了提到“IST”列是“时间”列,数据格式为“12:30:00.0000000”...谢谢
【解决方案4】:

在@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)

【讨论】:

  • 如果您想从crea_date减去时间,请将“00:00:00”与IST 交换。
  • 请不要添加“谢谢”作为答案。在网站上投入一些时间,您将获得足够的 privileges 来为您喜欢的答案投票,这是 Stack Overflow 表达感谢的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2011-05-15
  • 2015-02-03
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
相关资源
最近更新 更多