尝试类似下面的代码。如果您按计划运行,您可能需要弄清楚如何将“现在”的正确值传递给查询。例如,周一运行是看周日,还是看周五?
declare
@dtNow datetime ,
@dtToday datetime ,
@dtFrom datetime ,
@dtThru datetime ,
@dtExcludeFrom datetime ,
@dtExcludeThru datetime
set @dtNow = getdate()
set @dtToday = convert(datetime,convert(varchar,@dtNow,112),112)
set @dtFrom = dateadd(day,-1,@dtToday) -- start-of-day yesterday
set @dtThru = dateadd(ms,-3,@dtToday) -- end-of-day yesterday (e.g., 2012-06-17 23:59:59.997)
set @dtExcludeFrom = convert(datetime, convert(char(10),@dtFrom,120) + ' 06:30:00.000' , 120 )
set @dtExcludeThru = convert(datetime, convert(char(10),@dtFrom,120) + ' 07:15:00.000' , 120 )
SELECT Store_Id ,
DM_Corp_Received_Date
FROM Register_Till_Count_Tb
WHERE Register_Transaction_Type = 'SOD'
AND Register_Till_Count_Datetime between @dtFrom and @dtThru
AND Register_Till_Count_Datetime not between @dtExcludeFrom and @dtExcludeThru
这是计算变量值的示例:
@dtNow 2012-08-08 15:12:46.790
@dtToday 2012-08-08 00:00:00.000
@dtFrom 2012-08-07 00:00:00.000
@dtThru 2012-08-07 23:59:59.997
@dtExcludeFrom 2012-08-07 06:30:00.000
@dtExcludeThru 2012-08-07 07:15:00.000
对于datetime
值,一天中的最后一个“滴答”可能是23:59:59.996
在 SQL Server 2000 中。不过我不记得了(因为我不得不处理它已经太久了)。如果是,则需要更改dateadd(ms,-3,...)
为dateadd(ms,-4,...)
.
就时区而言,SQL Server 2000 对它们一无所知。对UTC也一无所知。日期时间值只是自 1900-01-01T00:00:00.000 纪元以来的天数和小数天数。
它是代表 UTC 还是本地时间完全取决于您的系统是如何设置的。如果日期/时间值来自用户或其他系统,则您依赖于数据源的含义。
就从东部标准时间 (EST) 到中部标准时间 (CST) 的转换而言,CST 比东部时间早一小时,因此只需减去一小时即可获得 EST:dateadd(hour,-1,@my_datetime_value)
应该是这样。如果您必须处理夏令时(夏季)时间和标准时间之间的界限,它会变得 [much] 更复杂,因为您需要知道日期/时间值的源轨迹,并且很可能,无论是记录系统没有以任何方式标准化日期/时间值。
例如,在 2005 年之前,印第安纳州表面上位于中央时区。但是,时区的选择 - 中部 (UTC-6) 或东部 (UTC-7) - 以及是否遵守夏令时是逐县进行的。一些县喜欢复活节时间。虽然有些县观察夏令时,但大多数都没有。这有效地使这些县根据一年中的什么时间在中部时间和东部时间之间切换。
2006 年,印第安纳州通过了一项法律,并 [某种] 标准化了东部时区和夏令时的观察……除了印第安纳州 92 个县中有 18 个在中部时间(该州西北角有 7 个,因为他们在芝加哥附近,这是中央时间,在该州的西南角 11 点,只是因为他们几乎什么都没有,所以很讨厌)。然后在 2007 年 3 月 11 日,普拉斯基县从中央时间更改为复活节时间。不知道自他们之后印第安纳州做了什么。
有关处理此类问题的困难的更多信息,请参阅Nachum Dershowitz和Edward M. Reingold所著的 [优秀!] 书Calendrical Calculations。这本书有自己的网站:
http://www.cs.tau.ac.il/~nachum/calendar-book/index.shtml
如果我要解决这个问题,我会设计某种映射表或多个表,让我查找在给定日期/时间值和邮政编码或基本邮政编码等轨迹的情况下要进行的适当调整。美国邮政编码的前 3 位数字为您提供城市或地区的基本邮政编码。例如,西雅图的基本邮编是 98100。
在表格中查找要加载的数据,这些数据与时区随时间的使用情况有关,是否在该位置观察到夏令时,如果是,则每个位置的特定年份或年份范围的转换日期可能是什么成为一个挑战。