使用GETDATE() - 1和从{到

时间:2016-02-24 13:00:48

标签: sql sql-server

我希望从前一天的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')

3 个答案:

答案 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)

SQL Server中的

GETDATE()返回系统日期和时间以到达当天(即00:00:00.0000000时的日期),您可以使用以下任一方法:

  • 强制转换(getdate()作为日期) - 可从SQL 2008开始使用
  • dateadd(day,datediff(day,0,getdate()),0) - 任何SQL Server版本

使用这些来确定当前日期,然后添加(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

顺便说一句:这里讨论的这种方法适用于跨越午夜的时间范围。