【问题标题】:How can i get the hour between two datetime in sql?如何在sql中获取两个日期时间之间的小时数?
【发布时间】:2018-11-22 10:51:31
【问题描述】:

下面的 sql 显示 57 小时,但是,它是 44 小时。我该如何解决。

SELECT  DATEDIFF(Hour,'2018-11-20 2:26:38.000','2018-11-22 11:00:29.367')

【问题讨论】:

    标签: sql-server sql-server-2008 select hour


    【解决方案1】:

    两个日期都使用 24 小时格式

    SELECT  DATEDIFF(Hour,'2018-11-20 14:26:38.000','2018-11-22 11:00:29.367')
    

    【讨论】:

    • 如何将日期时间转换为 24 小时格式 '2018-11-20 2:26:38.000'
    • 您已包含 AM 或 PM 以将其转换为 24 小时格式 SELECT CONVERT(DATETIME, '2018-11-20 2:00:00 PM', 0)
    • @ShahanaAkterPingkey 如果您没有存储时间是上午还是下午,那么您已经丢失了该信息。如果我说时间是 11:01,然后问你是 24 小时制的时间,没有额外的信息,你怎么知道是 11:01 还是 23:01? (答案:你没有)。 SQL Server 也无法推断此信息。
    • 我存储它的日期可以是上午/下午。但是,最后一个日期我与 GETDATE()
    • @ShahanaAkterPingkey 那么,如何判断是上午/下午?
    【解决方案2】:

    不将小时数前缀为两位数看起来可能是问题所在,明确地在下午给出结果。

    /*------------------------ 选择日期(小时,'2018-11-20 14:26:38.000','2018-11-22 11:00:29.367') ------------------------------------*/ 45

    您的默认日期时间格式可能是 12 小时,“2:…”被视为下午。

    使用两位数表示小时应该会有所帮助。

    /*------------------------ 选择日期(小时,'2018-11-20 02:26:38.000','2018-11-22 11:00:29.367') ------------------------------------*/ 57

    (SQL Server 有很多向后兼容性可能会触发输入格式不精确,ISO 日期/时间格式总是使用两位数表示小时、分钟和秒。)

    如果您使用的是客户端(而不是存储过程/函数/触发器/...中的固定代码),则对查询进行参数化可避免此问题:直接将数据作为日期时间类型传递,无需转换为字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多