【问题标题】:SQL DATEDIFF of am pm上午下午的 SQL DATEDIFF
【发布时间】:2015-08-27 09:54:20
【问题描述】:

我想计算两次之间的时间差,但我的问题是第二次可能是在午夜之后,而第一次是这样的:

time 1  = '2015-08-02 09:30 PM'   
time 2  = '2015-08-03 02:30 AM'

所以在这种情况下,它们之间的差异将是负数, 我尝试将 -1 返回的值乘以将其转换为正值,但其他数据会出错..

我的代码是:

DECLARE @StartDate datetime = '2015-08-02';
DECLARE @EndDate datetime = '2015-08-02';
DECLARE @EmpID nvarchar(6) = '12345';

SELECT
SUM(CASE WHEN(DATEDIFF(minute, a.[Time], @StartDate)) < 0
then DATEDIFF(minute, a.[Time], @StartDate) * -1 
ELSE DATEDIFF(minute, a.[Time], @StartDate) END
)

FROM
Attendance a
WHERE
(EmpID = @EmpID OR @EmpID IS NULL)
AND a.[date] <= @EndDate
GROUP BY EmpID

那我该如何解决呢?

【问题讨论】:

  • END 不应该在您的CASE 语句中的ELSE 之后吗?这是一个错字还是你的代码是这样的?
  • 是的 Raj,我已经更正了..
  • 也许可以尝试将数据转换为 24 位格式,例如 Convert(datetime, '2015-08-02 09:30 PM')。
  • @PatrykImosa 这不会产生影响,datediff 将自动尝试将第二个和第三个参数转换为日期时间。据我们所知,这些列可能已经是日期时间了

标签: sql sql-server time datediff


【解决方案1】:

我在您的代码中没有发现任何问题。但我会改用这种语法:

SUM(ABS(DATEDIFF(minute, a.[Time], @StartDate)))

【讨论】:

    【解决方案2】:

    我认为如下:

    CASE WHEN a.[Time] > @StartDate 
    THEN DATEDIFF(minute,@StartDate,a.[Time])
    ELSE DATEDIFF(minute,a.[Time],@StartDate)
    END
    

    应该这样做并且总是会给出一个积极的价值。

    select datediff(minute, '2015-08-02 09:30 PM'  ,'2015-08-03 02:30 AM')
    

    返回 300,这是正确的(5 小时,5 * 60 =300)

    【讨论】:

      猜你喜欢
      • 2012-03-28
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      相关资源
      最近更新 更多