【问题标题】:Calculate difference between dates in SQL using datetime fields without converting to char/varchar使用日期时间字段计算 SQL 中日期之间的差异,而不转换为 char/varchar
【发布时间】:2023-03-14 04:37:01
【问题描述】:

我目前正在寻找日期之间的时差并输出到小时 (00:00)。但是,我将继续对这个计算求和,这意味着我无法转换为 char/varchar。

请参阅下面的示例数据,我希望它如何显示。

EMPLOYEE_ID Start               End                 Duration
1           05/06/2015 08:30    05/06/2015 12:12    03:42
1           05/06/2015 13:18    05/06/2015 17:00    03:42
1           06/06/2015 08:30    06/06/2015 12:12    03:42
1           06/06/2015 13:18    06/06/2015 17:00    03:42

持续时间的当前代码:

CONVERT(varchar(5),DATEADD(minute,DATEDIFF(minute,Start, End),0), 114) as Duration

显然,此代码不是我想要的,因为它是 varchar,我想继续将两个持续时间相加。我环顾四周,但找不到任何可以说明如何做到这一点的东西。

【问题讨论】:

    标签: sql sql-server datetime duration


    【解决方案1】:

    以分钟为单位计算持续时间:

    select datediff(minute, start, end) as duration_min
    . . .
    

    这更容易使用。然后总结分钟数:

    select sum(datediff(minute, start, end)) as duration_min
    

    我会建议像这样离开它。但是如果你想要 HH:MM 格式,那就手动转换成你想要的格式的字符串。

    不要使用time 数据类型。限制为 24 小时。

    【讨论】:

      【解决方案2】:

      SQL Server doesn't currently supoort the ANSI SQL INTERVAL data type 因此,支持聚合的最佳方法是以一致的计量单位(如您在此处使用的分钟)计算持续时间,然后使用聚合结果从固定的日期时间值计算间隔.虽然下面的示例使用FORMAT 函数将结果转换为字符串,但我建议在表示层而不是 T-SQL 中完成用于显示目的的格式化。

      CREATE TABLE dbo.EmployTimeRecord (
            EMPLOYEE_ID int NOT NULL
          , StartTime smalldatetime NOT NULL
          , EndTime smalldatetime NOT NULL
          , DurationMinutes AS DATEDIFF(minute, StartTime, EndTime)
          );
      
      INSERT INTO dbo.EmployTimeRecord(EMPLOYEE_ID, StartTime, EndTime)
          VALUES
            (1, '2015-05-06T08:30:00', '2015-05-06T12:12:00')
          , (1, '2015-05-06T13:18:00', '2015-05-06T17:00:00')
          , (1, '2015-05-06T08:30:00', '2015-05-06T12:12:00')
          , (1, '2015-05-06T13:18:00', '2015-05-06T17:00:00');
      
      
      SELECT
            EMPLOYEE_ID
          , FORMAT(DATEADD(minute, SUM(DurationMinutes), ''), 'HH:mm') AS Duration
      FROM dbo.EmployTimeRecord
      GROUP BY EMPLOYEE_ID;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 2010-11-08
        • 2020-01-02
        • 1970-01-01
        • 2019-03-13
        相关资源
        最近更新 更多