如何在特定时间之前过滤结果

时间:2012-08-08 18:46:56

标签: sql sql-server datetime sql-server-2000

我有一个查询从昨天的日期获取结果。我想做的是通过仅将Pior的结果返回到上午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

其他棘手的部分是以上是在中部时间,我的时区是东部。所以我需要将它转换为东部THEN过滤结果。

2 个答案:

答案 0 :(得分:2)

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

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值时,SQL Server 2000中当天的最后一个“tick”可能是23:59:59.996。我记不起来了(因为我不得不处理它太久了) 。如果是,则需要将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)。如果你必须处理夏令时(夏令时)和标准时间之间的界限,它会变得更复杂,因为你需要知道日期/时间值的来源 locus 很可能,录音系统是否以任何方式标准化日期/时间值。

例如,在2005年之前,印第安纳州表面上是在中部时区。但是,时区的选择 - 中央(UTC-6)或东部(UTC-7) - 以及是否观察到夏令时是在逐个县的基础上进行的。有些县喜欢复活节时间。虽然有些县的观察员节省了夏令时,但大部分都没有。这有效地使这些县在中部时间和东部时间之间切换,取决于一年中的什么时间。

2006年,印第安纳州通过了一项法律,并对东部时区进行了标准化,并对夏令时进行了观察......除了印第安纳州92个县中的18个在中部时间(在西北角的7个县)州,因为他们在芝加哥附近,这是中部时间,在州的西南角11,因为他们几乎没有任何东西,只是为了勉强。然后在2007年3月11日,普拉斯基县从中部时间改为复活节时间。不知道印第安纳州从那以后做了什么。

更多 - 更多 - 关于处理此类内容的困难,请参阅Calendrical CalculationsNachum Dershowitz的[优秀!]一书Edward M. Reingold。这本书有自己的网站:

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

Calendrical Calculations Cover

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

查找有关时区使用情况的表格中加载的数据,是否在该位置观察到夏令时,如果是,则每个特定年份或年份的转换日期是多少位置可能是一个挑战。

答案 1 :(得分: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个日期比更改表格中的所有日期更快,因此只更改过滤日期会更有效。

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