1

我有一个查询从昨天的日期获取结果。我想做的是更多地过滤结果,只返回早上 6:30 或早上 7:15 之后的任何结果。如果结果介于上午 6:30 和 7:15 之间,我不关心结果。

以下是我的查询:

SELECT Store_Id, DM_Corp_Received_Date
FROM   Register_Till_Count_Tb
WHERE  (Register_Transaction_Type = 'SOD') 
  AND  (Register_Till_Count_Datetime >= DATEADD(day, DATEDIFF(day, 0, GETDATE()) - 1, 0)) 
  AND  (Register_Till_Count_Datetime < DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0))

这是输出:

Store_ID DM_Corp_Received_Date
1        8/7/2012 5:29 AM
2        8/7/2012 6:15 AM
3        8/7/2012 6:29 AN
4        8/7/2012 5:53 AM
5        8/7/2012 6:12 AM
6        8/7/2012 6:23 AM
7        8/7/2012 6:00 AM
8        8/7/2012 6:08 AM
9        8/7/2012 5:39 AM
10       8/7/2012 6:14 AM

另一个棘手的部分是上面是在中央时间,我的时区是东部。所以我需要将其转换为东部然后过滤结果。

4

2 回答 2

2

尝试类似下面的代码。如果您按计划运行,您可能需要弄清楚如何将“现在”的正确值传递给查询。例如,周一运行是看周日,还是看周五?

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 DershowitzEdward M. Reingold所著的 [优秀!] 书Calendrical Calculations。这本书有自己的网站:

http://www.cs.tau.ac.il/~nachum/calendar-book/index.shtml

历法计算封面

如果我要解决这个问题,我会设计某种映射表或多个表,让我查找在给定日期/时间值和邮政编码或基本邮政编码等轨迹的情况下要进行的适当调整。美国邮政编码的前 3 位数字为您提供城市或地区的基本邮政编码。例如,西雅图的基本邮编是 98100。

在表格中查找要加载的数据,这些数据与时区随时间的使用情况有关,是否在该位置观察到夏令时,如果是,则每个位置的特定年份或年份范围的转换日期可能是什么成为一个挑战。

于 2012-08-08T19:51:12.270 回答
1

您可以使用 BETWEEN 函数。例如

SELECT value
FROM table
WHERE date_col NOT BETWEEN '2012-08-08 06:30' AND '2012-08-08 07:15'

要将时间转换为东部时间,您可以更改过滤器(增加一个小时),也可以使用

DATEADD(hh,-1,date_col)

这基本上会从每个日期减去一个小时。显然,更改 1 个日期比更改表中的所有日期要快,因此仅更改过滤器日期会更有效。

如果您有更多问题,也许您可​​以发布更多信息。

于 2012-08-08T19:26:16.460 回答