我有一个包含日期列和时间列的表,每当用户执行计划任务时,它就会被填充。他们通常有两个小时的时间来完成任务,而我似乎不知道如何查看今天是否完成了任务。
例如,如果现在是凌晨12:30,我需要检查它是在前一天晚上11:30完成的,还是在今天凌晨12:01完成的。我将所有的时间和日期存储为中心时间,并有一个偏移数,以便根据其他时区进行调整。
这是我卡住的地方,这适用于昨晚完成的事情,但如果它是在今天午夜之后完成的(@DatePartOfDateTime
是我正在检查的日期(它已经更正了时区),@EndTime
是我正在检查的时间,看看是否发生了):
select 1 from tblMedsDispensed
where DatePassed =
case when (@EndTime = '23:59' or @Offset < 0 and @EndTime < '21:59')
and TimePassed < '01:00'
-- For midnight, if the time passed is < 01:00 then roll it back a day
then dateadd(DAY,1,@DatePartOfDateTime )
else @DatePartOfDateTime end
and tblMedsDispensed.patdrugs_fk = tblPatDrugs.PatDrugs_id
任何想法?
我猜一下。我认为你不需要在所有这些变量和时间分量上瞎折腾。你要做的是旋转时钟,这样你的逻辑开始与日历日一致,这样日期比较就很容易了。
select *
from tblMedsDispensed
where
cast(dateadd(hh, @Offset - 1, DatePassed) as date) = cast('<literal date>' as date)
编辑:我又看了一遍你的问题,我看到你有两列。这里的想法是当小时组件小于1时,将日期值向后调整一天。我还是不清楚你的容忍度是一小时还是两小时。
dateadd(
hh,
case when hour(dateadd(hh, @Offset, <TimeColumn>)) < 1 then -1 else 0 end,
<DateColumn>
)