【问题标题】:Find Time Difference in tsql在sql中查找时差
【发布时间】:2017-01-13 23:56:16
【问题描述】:

我有两个约会:

2016-11-10 18:30:00
1901-01-01 19:00:00

我需要返回的时间差是 30 分钟,因此是 0.5 小时。我完全不关心日期。

我确实意识到这是一个常见问题,但我很难将找到的答案应用于我的具体问题。

任何帮助表示赞赏。

【问题讨论】:

  • @jmoerdyk 我要么误读了您链接中提供的答案,无法找出答案,要么您误解了我的问题。我只需要日期的小时部分之间的差异。
  • 您是否阅读过DATEDIFF 函数的文档?您将使用HOURSMINUTES 作为datepart 参数。
  • 你的意思是你只关心时间部分而不关心日期时间的日期部分吗?
  • @GantTheWanderer 这是正确的。鉴于我发布的日期,我正在寻找的答案是 30 分钟。理想情况下,我希望将其表示为一个小时的一小部分,0.50。

标签: sql-server tsql


【解决方案1】:

这应该为您指明合适的方向:

declare @Foo as DateTime = '2016-11-10 18:30:00',
  @Bar as DateTime = '1901-01-01 19:00:00';
select @Foo as Foo, @Bar as Bar,
  Cast( @Foo as Time ) as FooTime, Cast( @Bar as Time ) as BarTime,
  DateDiff( minute, Cast( @Foo as Time ), Cast( @Bar as Time ) ) as DeltaMinutes;

【讨论】:

  • 感谢您的帮助,但结果是 690。我是否遗漏了您的解释中的某些内容,或者我不理解 DateDiff 运行方式的某些基本方面?
  • @MPJ567 如果用'2016-11-10T18:30:00''1901-01-01T19:00:00' 替换日期/时间会得到什么?这些是 ISO 格式,应该不受国际化问题的影响。中间结果是预期值吗,即FooTime18:30:00.0000000
  • 我第一次尝试这个时一定做错了什么。第二次尝试,一切顺利。非常感谢您的帮助。
【解决方案2】:

我不知道它涵盖了所有情况,但您可以按照以下方式进行。

DECLARE @Val1 DATETIME = '2016-11-10 18:30:00'
DECLARE @Val2 DATETIME = '1901-01-01 19:00:00'

SELECT ABS(DATEDIFF(MINUTE, RIGHT(@Val2, 8), RIGHT(@Val1, 8))) -- 30

【讨论】:

  • 您可以使用7 而不是8 作为子字符串长度,因为将DATETIME 转换为VARCHAR 的默认格式是“mon dd yyyy hh:miAM (or PM) ”。 (Ref。如果你select Right( @Val1, 19 ), Right( @Val1, 8 ),你会看到额外的空格(和丢失的秒数)。而不是往返于文本和返回,并且由于国际化可能带来的乐趣,坚持更可靠用数字处理日期和时间。
  • 这也是 690,@Habo 提供的另一个答案也是如此。我猜我在这里遗漏了一些非常简单的东西。任何进一步的澄清将不胜感激。
【解决方案3】:

我在 Teradata-SQL 中也遇到过类似的情况,时间是 Integer,所以可以采取如下差异:

SELECT CAST(CAST((END_TM-STRT_TM)AS INTEGER FORMAT '99:99:99') AS INTEGER FORMAT'99:99') as New_Diff FROM TABLE

【讨论】:

    猜你喜欢
    • 2013-03-16
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多