sql-server - 如何通过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()
解决方案
如果我正确理解您的问题,那么您希望根据执行查询的时间检索不同的行。
使用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;
小提琴来看看一切在行动。
推荐阅读
- angular - 如何从集合中获取一个文档,离子选择列出所有文档?
- audio - 使用 Julia 在声音上使用 fft
- java - 为什么我缓冲的 `String` 与 `RegEx` 模式不匹配?
- python - 如何修复'TypeError:'module'对象不可调用'
- mysql - 如果至少一个条件不满足,则消除所有标识符
- html - 如何重新调整容器大小以适合其子项的宽度
- c++ - 我将如何在 C++20 中传递范围而不是迭代器对?
- vue.js - Vue-Multiselect删除事件如何获取值和id
- ios - Airplay 处于活动状态时,AVRoutePickerView 不会改变颜色
- spring - Spring data Page/Pageable 在大型数据集上返回重复项?