【问题标题】:Time Difference between two time columns in sql serversql server 中两个时间列的时间差
【发布时间】:2019-05-20 00:33:48
【问题描述】:

我在获取 sql server 中两个时间列之间的分钟差时遇到了问题。

Column1: Starttime
Column2: Endtime

这两个是 nchar(10) 类型,我通过以下方式将它们转换为时间格式并使用 datediff 函数。 如果这两列具有 AM 格式或 PM 格式,那么分钟差就可以了。但是,如果我的开始时间是 PM 格式,而结束时间是 AM(SQL 将其作为第二天)格式,那么我得到的分钟数比预期的要负数。

select 
    dty_act_start_time,
    dty_act_end_time,
    datediff(minute, convert(varchar,dty_act_start_time,114),convert(varchar,dty_act_end_time,114)) 
from DB.Mydatabase;

请告诉我如何在分钟内得到正确的差异。

【问题讨论】:

  • 那些不是时间列,它们是内容未知的字符串。没有什么能确保这些字段实际上包含英文风格的 AM/PM 时间字符串。如果要存储时间,请使用 正确 类型,即timedatetime 等。
  • 除非您提供样本数据和期望的结果,否则我们只能猜测。
  • I converted them into time format. 这显然是错误的。您将它们从一种字符串类型转换为另一种字符串类型。 SQL 数据库有 datetime 和 time 类型是有原因的。

标签: sql sql-server tsql datetime time


【解决方案1】:

如果开始时间大于结束时间,只需添加 1440 分钟(24 小时的分钟数):

select
    start_time_time,
    end_time_time,
    datediff(minute, start_time_time, end_time_time) + iif(start_time_time <= end_time_time, 0, 1440) as diff
from (
    select
    convert(time(0), dty_act_start_time, 114) as start_time_time,
    convert(time(0), dty_act_end_time, 114) as end_time_time
    from (values
        ('09:00am', '10:00pm'),
        ('10:00pm', '09:00am')
    ) tests(dty_act_start_time, dty_act_end_time)
) x

结果:

start_time_time | end_time_time | diff
09:00:00        | 22:00:00      | 780
22:00:00        | 09:00:00      | 660

【讨论】:

  • 这可能适用于用户需求(假设始终存在 1 天的差异);但其他人需要注意,如果涉及多天,这不符合要求;但由于问题中只列出了时间,因此必须做出一些假设。
  • @xQbert 如果 OP 使用日期时间,那么根本不会有歧义。 2000-01-03 的 01:00 大于 2000-01-01 的 23:00。
  • 同意。我在过去看到的问题是它大于 24 小时的时间差。然后,他们想知道有多少天……这是不可能的。这里可能/可能不是这种情况。但是,如果您同时有时间和日期,则很容易确定差异。
猜你喜欢
  • 2011-01-08
  • 2020-06-30
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多