我希望从前一天的SuperScottTable1
获得总计数,并缩小到时间范围(从 - 到)。以下工作正常,直到我添加
AND (time > '08:00:00.000' AND time < '22:00:00.000')
它没有错误,只返回null。
这可能吗?
SELECT
SUM(COALESCE(confirmedCount, 0))
FROM
SuperScottTable1
WHERE
superLaneID = '90099'
AND time >= GETDATE()-1
AND (time > '08:00:00.000' AND time < '22:00:00.000')
答案 0 :(得分:1)
您可以执行一些CAST / CONVERT恶作剧来生成启动和停止DATETIME值,然后您可以将其与时间列进行比较。如果时间列已编制索引,那么这将允许服务器对索引进行简单范围搜索以查找匹配项。
WHERE
superLaneID = '90099'
AND time > CAST(CONVERT(VARCHAR(20), GETDATE()-1, 112) + ' 08:00:00' AS DATETIME)
AND time < CAST(CONVERT(VARCHAR(20), GETDATE()-1, 112) + ' 22:00:00' AS DATETIME)
答案 1 :(得分:0)
据推测,time
存储为datetime
。您似乎正在使用SQL Server,因此您可以提取小时并使用它:
WHERE superLaneID = '90099' AND
time >= GETDATE()-1 AND
datepart(hour, time) >= 8 AND
datepart(hour, time) < 22
编辑:要获得“其他”时间:
WHERE superLaneID = '90099' AND
time >= GETDATE()-1 AND
(datepart(hour, time) < 8 or
datepart(hour, time) >= 22
)
答案 2 :(得分:0)
GETDATE()返回系统日期和时间以到达当天(即00:00:00.0000000时的日期),您可以使用以下任一方法:
使用这些来确定当前日期,然后添加(8-24)小时和/或(22-24)小时以确定昨天的界限,例如
WHERE superLaneID = '90099'
AND time >= dateadd(hour,(8-24),cast(getdate() as date))
AND time < dateadd(hour,(22-24),cast(getdate() as date))
避免使用要求您更改每行数据以与固定值进行比较的非可搜索谓词(例如使用函数)。 ref this prior answer
顺便说一句:这里讨论的这种方法适用于跨越午夜的时间范围。