【问题标题】:SQL DATEDIFF past midnight with no dateSQL DATEDIFF 午夜过后没有日期
【发布时间】:2022-10-24 18:40:54
【问题描述】:

有没有办法在没有完整日期时间的情况下计算两次之间的差异,并且如果时间过了午夜就不会得到错误的答案?下面的行可以从 23:00 到 03:20,这应该是 4 小时 20 分钟。但是当我在时间前面使用没有日期的 DATEDIFF 时,它总是给我 19 小时 40 分钟。我试图改变时间的顺序,但没有帮助。我真的没有这个日期的选项。任何帮助将不胜感激。

DATEDIFF(MINUTE, MT.MilTime , MT1.MilTime) AS TotalRun,

【问题讨论】:

  • 非常感谢你们俩。我没有足够的声望点来支持,或者我会支持两个答案。我在我的报告中都使用了它们,它们都运行良好。再次感谢你。

标签: sql datediff


【解决方案1】:

试试下面

DECLARE @Date1 time = '23:00:00.000';
DECLARE @Date2 time = '03:20:00.000';

SELECT DATEDIFF(MINUTE,@Date1,@Date2),CONVERT(varchar(5), 
       DATEADD(minute, DATEDIFF(minute, @Date1, @Date2), 0), 114);

【讨论】:

  • 这是一个正确的答案,并且放在我之前,这就是我赞成它的原因。如果您希望以时间格式回答,例如04:20,那么这就是使用的方法。但是,如果您只想要分钟数,我会输入另一个答案,这会使计算更容易。
【解决方案2】:

如果您想要一个格式化的答案(例如,在您的示例中为 04:20),那么@JohnConner 的答案是一个很好的答案 - 这就是为什么我也给了它一个赞成票。

但是,如果您想获得两者之间的分钟数(作为整数),您可以进行初始检查(哪个更大)然后执行不同的计算。

或者,有一种更简单的方法

  • 将日期差异作为@JohnConner 的答案DATEDIFF(MINUTE,@Date1,@Date2)
  • 在答案中添加 1440
  • 取结果的“mod 1440”(例如,除以 1440,只取余数)

它之所以有效,是因为 1440 是一天中的分钟数,

  • 如果初始结果是否定的(超过午夜),它会增加一天的分钟数。新结果将是 a) 正确答案,并且 b) 小于 1440,因此 mod 不会做任何事情。
  • 如果初始结果是肯定的(例如,@Date2 在@Date1 之后),则添加 1440 并执行 mod 1440,将返回与最初相同的结果。
DECLARE @Date1 time = '23:00:00.000';
DECLARE @Date2 time = '03:20:00.000';

SELECT (DATEDIFF(MINUTE,@Date1,@Date2) + 1440) % 1440 AS Mins_Difference

请注意,阅读它的任何其他编码人员都不知道您在做什么,因此最好确保您有评论说明计算的作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多