我有一个查询从昨天的日期获取结果。我想做的是通过仅将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过滤结果。
答案 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 Calculations和Nachum Dershowitz的[优秀!]一书Edward M. Reingold。这本书有自己的网站:
http://www.cs.tau.ac.il/~nachum/calendar-book/index.shtml
如果我要解决这个问题,我会设计一些映射表或表来让我查找适当的调整,给定日期/时间值和一个像邮政编码或基本拉链的轨迹码。美国邮政编码的前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个日期比更改表格中的所有日期更快,因此只更改过滤日期会更有效。
如果您有更多问题,也许您可以发布更多信息。