首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GETDATE()-1和时间段from/to查询前一天

使用GETDATE()-1和时间段from/to查询前一天
EN

Stack Overflow用户
提问于 2016-02-24 21:00:48
回答 3查看 32.8K关注 0票数 2

我想从SuperScottTable1获取前一天的总计数,并将范围缩小到一个时间范围(从到)。下面的代码运行良好,直到我添加了

代码语言:javascript
复制
AND (time > '08:00:00.000' AND time < '22:00:00.000')

它不会出错,只是返回null。

这有可能做到吗?

代码语言:javascript
复制
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')
EN

回答 3

Stack Overflow用户

发布于 2016-02-27 12:09:36

您可以执行一些强制转换/转换恶作剧,以生成开始和停止日期时间值,然后可以将该值与时间列进行比较。如果对时间列进行了索引,则这将允许服务器对索引执行简单的范围搜索以查找匹配项。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-02-24 21:03:49

据推测,timedatetime的形式存储。您似乎正在使用SQL Server,因此您可以提取小时并使用它:

代码语言:javascript
复制
WHERE superLaneID = '90099' AND
      time >= GETDATE()-1 AND
      datepart(hour, time) >= 8 AND
      datepart(hour, time) < 22

编辑:获取“其他”小时数:

代码语言:javascript
复制
WHERE superLaneID = '90099' AND
      time >= GETDATE()-1 AND
      (datepart(hour, time) < 8 or
       datepart(hour, time) >= 22
      )
票数 0
EN

Stack Overflow用户

发布于 2016-02-27 12:44:29

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

日期) --来自SQL2008getDatediff(

  • cast(getdate(),0,getdate() ),0) --任何SQL onward
  • dateadd(day,版本

使用它们来建立当前日期,然后添加(8-24)小时和/或(22-24)小时来建立昨天的边界,例如

代码语言:javascript
复制
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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35602924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档