【问题标题】:How do I subtract two datetime values?如何减去两个日期时间值?
【发布时间】:2019-08-14 07:18:27
【问题描述】:

我有一个包含两列 loginlogout 的表。如果一行在login 列中具有值“2019-08-07 20:37:12”,在logout 列中具有值“2019-08-07 21:14:16”,我想要登录时间值之间的差异和注销列。

我有:

SELECT logintime,CONVERT(varchar(6),DATEDIFF(second, login, logout)/3600)
+ ':'
+ RIGHT('0' + CONVERT(varchar(2),(DATEDIFF(second, login,logout) % 3600) / 60), 2)
+ ':'
+ RIGHT('0' + CONVERT(varchar(2),DATEDIFF(second, login, logout) % 60), 2) 
AS 'HH:MM:SS' from face_login_logout

预期结果是'2019-08-07 01:23:04 '

【问题讨论】:

  • 您使用的是什么 DBMS?
  • 基于 convert()datediff()+ 作为字符串连接运算符的使用,重新标记为 sql-server
  • 如果登录和注销将在不同的日期,例如:登录“2019-08-07 23:37:12”注销“2019-08-08 00:14:16”什么日期预计?
  • 您的实际结果是什么,为什么您希望答案中有日期?
  • 但是你的结果应该是什么?在您的示例中,这两个日期之间的差异是 00:37:04。您的答案是如何得到“2019-08-07 01:23:04”的?我不明白

标签: sql sql-server tsql date-arithmetic sqldatetime


【解决方案1】:

你的例子最简单的方法:

SELECT TO_TIMESTAMP('2019-08-07 21:14:16','YYYY-MM-DD HH24:MI:SS') - TO_TIMESTAMP('2019-08-07 20:37:12','YYYY-MM-DD HH24:MI:SS')

但结果是 00:37:04。

SELECT TO_TIMESTAMP(logout,'YYYY-MM-DD HH24:MI:SS') - TO_TIMESTAMP(login,'YYYY-MM-DD HH24:MI:SS')

【讨论】:

    【解决方案2】:

    正如@lypskee 所建议的那样,我认为您的计算结果已经过时了。

    我找到了下面的方法(看起来和你的代码一样),它告诉我有0:37:04的区别

    DECLARE @START_DATE DATETIME
    DECLARE @END_DATE   DATETIME
    SET     @START_DATE = '2019-08-07 20:37:12'
    SET     @END_DATE =   '2019-08-07 21:14:16'
    
    SELECT    CONVERT(varchar(6), DATEDIFF(second, @START_DATE, @END_DATE)/3600)
    + ':'
    + RIGHT('0' + CONVERT(varchar(2), (DATEDIFF(second, @START_DATE, @END_DATE) % 3600) / 60), 2)
    + ':'
    + RIGHT('0' + CONVERT(varchar(2), DATEDIFF(second, @START_DATE, @END_DATE) % 60), 2) AS 'HH:MM:SS'
    

    更新 - 调整为从表中拉取。

    SELECT login, logout, CONVERT(varchar(6), DATEDIFF(second, login, logout)/3600)
        + ':'
        + RIGHT('0' + CONVERT(varchar(2), (DATEDIFF(second, login, logout) % 3600) / 60), 2)
        + ':'
        + RIGHT('0' + CONVERT(varchar(2), DATEDIFF(second, login, logout) % 60), 2) AS 'difference'
    
    FROM tbl_name
    

    这将为您提供表中每一行的结果...您也可以针对任何空值调整查询。

    输出:

    login                |  logout               |  difference
    -----------------------------------------------------------
    2019-08-07 20:37:12  |  2019-08-07 21:14:16  |  0:37:04
    

    【讨论】:

    • 但是在这种方法中,我们提供了开始日期、结束日期的值,如果超过一行我们不能每次都提供值没有
    • 所以你想在一张桌子上运行这个?我在上面添加了一个编辑
    • 它显示 ERROR: syntax error at or near "," LINE 1: SELECT logintime, logout, CONVERT(varchar(6), DATEDIFF(secon...
    • 您能发布完整的 SQL。以上对我有用,所以它可能是你自己查询的语法中的东西
    • 那么我们是否在 postgress 中使用 sql 查询,即 pg admin3
    【解决方案3】:
    DECLARE @logintime DATETIME='2019-08-07 20:37:12'
    DECLARE @logouttime DATETIME='2019-08-07 21:14:16'
    
    SELECT CAST(CAST(@logouttime AS DATE) AS VARCHAR(20))+' '+
       CAST(ABS(DATEPART(HOUR,@logouttime)-DATEPART(HOUR,@logintime)) AS VARCHAR(20))+':'+
       CAST(ABS(DATEPART(MINUTE,@logouttime)-DATEPART(MINUTE,@logintime)) AS VARCHAR(20))+':'+
       CAST(ABS(DATEPART(SECOND,@logouttime)-DATEPART(SECOND,@logintime)) AS VARCHAR(20))
    

    【讨论】:

      【解决方案4】:

      对于 SQL Server,如果您确定差异小于 24 小时,则可以使用 timefromparts 将差异作为 time 数据类型获取。我还使用了 cross apply 来只写一次datediff 而不是三次。

      首先,创建并填充示例表(在您以后的问题中保存我们这一步):

      CREATE TABLE face_login_logout
      (
          login datetime,
          logout datetime
      )
      
      INSERT INTO face_login_logout (login, logout) VALUES
      ('2019-08-07T20:37:12','2019-08-07T21:14:16')
      

      查询:

      SELECT  login, 
              logout, 
              TIMEFROMPARTS(
                  Difference / 3600, 
                  (Difference % 3600) / 60, 
                  Difference % 60, 
                  0,
                  0 
              ) As TimeDiff
      FROM face_login_logout
      CROSS APPLY (SELECT DATEDIFF(SECOND, login, logout) As Difference) c
      

      结果:

      login                   logout                  TimeDiff
      2019-08-07 20:37:12     2019-08-07 21:14:16     00:37:04
      

      如果您想要datetime 作为结果,只需使用datetimefromparts

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多