首页 > 解决方案 > 如何通过sql中的日期时间逻辑获取数据

问题描述

我在 est 中有 date(dt col name) 列。如果我在 '7:30pm'EST 和 '11:59' Est timezone.i 之间执行查询。我应该得到前一天的信息,如果我在 12:00 之后执行我需要得到今天的信息。

我试过这个:

Case when getdate() between '2021-03-09 7:30:00' and '2021-03-09 11:59:00'
Then dt=getdate() -1 
else dt=getdate() 

标签: sql-serverdatetime-format

解决方案


如果我正确理解您的问题,那么您希望根据执行查询的时间检索不同的行。

使用case表达式可以工作,但是您必须将与case表达式结果的比较移到case 表达式之外。

所以不要:
... where case when <condition> then (Column = Value1) else (Column = Value2) end
这样做:
... where Column = (case when <condition> then Value1 else Value2 end)
为了清楚起见,这里添加了括号。

样本数据

create table MyTable
(
  dt date,
  data nvarchar(20)
);

insert into MyTable (dt, data) values
('2021-03-08', 'yesterday''s data'),
('2021-03-09', 'today''s data');

解决方案

从我的答案开始应用构造。对表达式的两个选项进行单元测试case将需要一个单独的变量(或者您可以等待几个小时......)。

在 [07:30, 11:59] 期间请求今天日期的数据

declare @referenceDate smalldatetime = '2021-03-09 10:20';
--> using date variable instead of 'getdate()' for demo purposes !

select mt.dt,
       mt.data
from MyTable mt
where mt.dt = case
                when @referenceDate between '2021-03-09 07:30:00' and '2021-03-09 11:59:00'
                then dateadd(day, -1, convert(date, @referenceDate))
                else convert(date, @referenceDate)
              end;
--> returns data from yesterday

请求今天日期以外的数据 [07:30, 11:59]

declare @referenceDate smalldatetime = '2021-03-09 17:40';
--> using date variable instead of 'getdate()' for demo purposes !

select mt.dt,
       mt.data
from MyTable mt
where mt.dt = case
                when @referenceDate between '2021-03-09 07:30:00' and '2021-03-09 11:59:00'
                then dateadd(day, -1, convert(date, @referenceDate))
                else convert(date, @referenceDate)
              end;
--> returns data from today

根据时段 [07:30, 12:00]在任何日期请求数据

select mt.dt,
       mt.data
from MyTable mt
where mt.dt = case
                when convert(time, getdate()) >= '07:30:00'
                 and convert(time, getdate()) <  '12:00:00'
                then dateadd(day, -1, convert(date, getdate()))
                else convert(date, getdate())
              end;
--> returns data from today OR yesterday depeding on time of execution (in/outside [07:30, 12:00])

您的问题还提到了EST timezone。如果您希望将当前执行时间解释为 EST,请查看此问题此文档页面。您是否应该首先将数据存储在 EST 而不是 UTC 中是另一个问题……您最终会得到这样的结果。

-- converting the query reference time to EST
declare @referenceDate smalldatetime = (select getdate() at time zone 'Eastern Standard Time');

select mt.dt,
       mt.data
from MyTable mt
where mt.dt = case
                when convert(time, @referenceDate) >= '07:30:00'
                 and convert(time, @referenceDate) <  '12:00:00'
                then dateadd(day, -1, convert(date, @referenceDate))
                else convert(date, @referenceDate)
              end;

小提琴来看看一切在行动。


推荐阅读