【问题标题】:SQL: match time on several minutesSQL:匹配时间为几分钟
【发布时间】:2011-06-30 17:42:59
【问题描述】:

我正在尝试匹配两个不同表中的日期时间。表 A 有固定时间 (09:29:35)。表 B 有一个四舍五入的时间 (09:30)。

表 B 的时间可能与表 A 的时间一致,也可能由于四舍五入而与前一分钟一致。

如何匹配这些时间?或者,我怎样才能“删除”表 A 中的秒数并同时在该表上舍入分钟数?

提前感谢您的帮助!

【问题讨论】:

  • 向下取整和向上取整时是否要同时匹配?假设表 B 有 09:30。您希望表 A 中的哪些值表示匹配? 09:29:35、09:29:01、09:27:00、09:30:01、09:30:59、09:31:00。日期也很重要,还是您想完全忽略日期?如果您忽略日期,为什么要使用 DATETIME 而不是 TIME?
  • 抱歉没有更好地解释。是的,我想匹配所有这些情况。我也想在日期匹配。
  • 那么你想要任何一侧的所有时间都在 1 分钟内,2 分钟内的任何一侧,还有别的吗?那么 09:31:59 和 09:32:00 呢?分界线在哪里?
  • 对不起,我很困惑。表 A 中的 09:31:59 将匹配表 B 中的 09:32,表 A 中的 09:32:14 也将匹配表 B 中的 09:32。

标签: sql tsql sql-server-2008 datetime


【解决方案1】:
SELECT * FROM tableA a
JOIN tableb b
ON a.regulartime between dateadd(minute, -5, b.roundtime)
AND dateadd(minute, +5, b.roundtime)

【讨论】:

    【解决方案2】:

    您可以使用演员表删除秒数:

    convert(varchar(16), getdate(), 120)
    

    这会在秒后截断日期,f.e. 2011-06-30 19:50(16 个字符长。)可以使用dateadd 完成分钟数的加减。

    如果你把它组合成一个连接,你会得到类似的东西:

    select  *
    from    TableA
    join    TableB
    on      convert(varchar(16), TableA.DateColumn, 120) between
            convert(varchar(16), dateadd(m,-1,TableB.DateColumn), 120)
            and convert(varchar(16), dateadd(m,1,TableB.DateColumn), 120)
    

    【讨论】:

    • 如果这些列上有索引,那就太可惜了。将它们转换为 varchar 会使索引无用,并会导致表扫描。
    • @Aaron,没有索引,但感谢您的解释。 @Andomar - 如果我删除秒数,它会向上还是向下取整?
    • 以这种方式删除秒数将截断。如果您转换为 SMALLDATETIME 以删除秒数,它会四舍五入。
    • @divided:它将截断(向下舍入)。改变它的一种方法是添加 90 秒而不是 1 分钟,这具有舍入的效果。那是dateadd(s,-90,...)
    • 在不需要的情况下转换为 varchar 并不是很好的 sql
    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 2011-11-13
    • 2021-06-26
    • 1970-01-01
    • 2018-08-17
    • 2011-02-18
    • 1970-01-01
    • 2019-08-03
    相关资源
    最近更新 更多