SQL日期介于时间和日期之间

SQL日期介于时间和日期之间,sql,sql-server-2008,date,Sql,Sql Server 2008,Date,使用此日期格式: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)将日期时间转换为时间:

使用此日期格式:
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)

将日期时间转换为
时间

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

将日期时间转换为
时间

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

如前所述,只需使用
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
    时间戳的行数

其总和应与总行数匹配。

如前所述,只需使用
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
    时间戳的行数

它们的总和应该与总行数匹配。

因此,我的数据库中有349226行。此查询返回了68554行的计数,但反向(9:00PM->5:00AM)返回了0行(这是错误的)。SQL是如何知道忽略时间之前的日期的?@RUJordan您是如何编写反向代码的?你不能说晚上9点和早上5点,0行将与之匹配。您需要
<5 AM或>9 PM
@RUJordan:您只需使用
not
操作符即可得到相反的结果:
其中转换(时间,时间戳)不在“17:00”和“21:00”之间
就可以了。任何
null
值都会使这两个测试失败,因为
null
会使所有测试失败,除了通过
is[not]null
对null进行显式测试之外。因此,我的数据库中有349226行。此查询返回了68554行的计数,但反向(9:00PM->5:00AM)返回了0行(这是错误的)。SQL是如何知道忽略时间之前的日期的?@RUJordan您是如何编写反向代码的?你不能说晚上9点和早上5点,0行将与之匹配。您需要
<5 AM或>9 PM
@RUJordan:您只需使用
not
操作符即可得到相反的结果:
其中转换(时间,时间戳)不在“17:00”和“21:00”之间
就可以了。任何
null
值都会使这两个测试失败,因为
null
会使所有测试失败,除了通过
进行的显式空性测试外,
is[not]null
。这不相关,但我强烈建议将您的数据类型从
NVARCHAR(MAX)
更改为
DATETIME2
(或只是DATETIME)。它可能会导致各种转换错误,占用更多的存储空间,并且需要在查询中进行更多的隐式和显式转换。进一步阅读-@GarethD是的,不幸的是我无法控制数据类型。不过我知道得更清楚,谢谢。没有关系,但我强烈建议将您的数据类型从
NVARCHAR(MAX)
更改为
DATETIME2
(或者只是DATETIME)。它可能会导致各种转换错误,占用更多的存储空间,并且需要在查询中进行更多的隐式和显式转换。进一步阅读-@GarethD是的,不幸的是我无法控制数据类型。不过我知道得更清楚,谢谢你。