我想从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')发布于 2016-02-27 12:09:36
您可以执行一些强制转换/转换恶作剧,以生成开始和停止日期时间值,然后可以将该值与时间列进行比较。如果对时间列进行了索引,则这将允许服务器对索引执行简单的范围搜索以查找匹配项。
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)发布于 2016-02-24 21:03:49
据推测,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
)发布于 2016-02-27 12:44:29
SQL Server中的GETDATE()返回到达当天的系统日期和时间(即,在时间00:00:00.0000000的日期)。您可以使用以下任一方法:
日期) --来自SQL2008getDatediff(
使用它们来建立当前日期,然后添加(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))避免使用需要更改每行数据以与固定值进行比较的非sargable谓词(如使用函数)。参考this prior answer
顺便说一句:这里讨论的这种方法适用于跨午夜的时间范围。
https://stackoverflow.com/questions/35602924
复制相似问题