【问题标题】:SQL Date Between Time Not DateSQL 日期之间的时间不是日期
【发布时间】:2014-06-04 17:09:19
【问题描述】:

使用这种日期格式:mm/dd/yyyy h:m AM/PM(例如:06/05/2014 5:00 PM),如何忽略实际日期并获取特定时间之间的数据计数? (例如下午 5 点至晚上 9 点)

我尝试过这样的事情,但当然它不起作用,我不确定 SQL 是否可以做到这一点:

SELECT COUNT(id) FROM mobile_statistics WHERE timestamp BETWEEN '5:00 PM' AND '9:00 PM';

注意:时间戳字段的类型为nvarchar(MAX)

【问题讨论】:

  • 不相关,但我强烈建议将您的数据类型从 NVARCHAR(MAX) 更改为 DATETIME2(或只是 DATETIME)。它可能导致各种转换错误,需要更多存储空间,并且需要在查询中进行更多工作才能进行隐式和显式转换。进一步阅读 - Bad habits to kick : choosing the wrong data type
  • @GarethD 是的,不幸的是我无法控制数据类型。不过我确实知道得更多,谢谢。

标签: sql sql-server-2008 date


【解决方案1】:

将日期时间转换为time

SELECT COUNT(id) 
FROM mobile_statistics 
WHERE CAST(timestamp AS time) BETWEEN '5:00 PM' AND '9:00 PM';

【讨论】:

  • 所以,我的数据库中有 349,226 行。此查询返回 68554 行的计数,但反之 (9:00PM -> 5:00AM) 返回 0 行(这是错误的)。 SQL 怎么知道忽略时间之前的日期?
  • @RUJordan 你到底是如何编码逆的?你不能说> 9 PM AND < 5 AM - 0 行会匹配。你需要< 5 AM OR > 9 PM
  • @RUJordan:您可以通过简单地使用 not 运算符来获得相反的结果:where convert(time,timestamp) NOT between '17:00' AND '21:00' 应该可以。任何null 值都将通过两个测试,因为null 会通过所有测试,但通过is [not] null 进行的显式无效测试除外。
【解决方案2】:

如上所述,只需使用convert() 将您的字符串转换为time 数据类型。然后你可以使用判别函数来计算桶中的东西。类似的东西

select within_business_hours  = sum(case when convert(time,timestamp))     between '17:00' and '21:00' then 1 else 0 end ) ,
       outside_business_hours = sum(case when convert(time,timestamp)) not between '17:00' and '21:00' then 1 else 0 end ) ,
       null_values            = sum(case when timestamp is null                                        then 1 else 0 end ) ,
from dbo.mobile_statistics ms

应该给你

  • 营业时间内带有时间戳的行数
  • 时间戳在营业时间以外的行数
  • 带有null 时间戳的行数

总和应该与总行数相匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-19
    • 2015-10-01
    • 2020-10-19
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    相关资源
    最近更新 更多