Sql 如何筛选特定时间之前的结果
我有一个查询,获取昨天日期的结果。我想做的是通过只返回结果或返回到早上6:30或7:15之后的结果来过滤更多的结果。如果结果在早上6:30到7:15之间,我不在乎结果 以下是我的疑问:Sql 如何筛选特定时间之前的结果,sql,sql-server,datetime,sql-server-2000,Sql,Sql Server,Datetime,Sql Server 2000,我有一个查询,获取昨天日期的结果。我想做的是通过只返回结果或返回到早上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 >= D
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))
另一个棘手的部分是上面是在中部时间,我的时区是东部。因此,我需要将其转换为Eastern,然后过滤结果。您可以使用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)
这基本上会从每个日期减去一个小时。显然,更改一个日期要比更改一个表中的所有日期快,因此只更改筛选日期将更有效
如果你有更多问题,也许你可以发布更多信息。试试下面的代码。如果要按计划运行查询,可能需要弄清楚如何将“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中,一天的最后一个“滴答声”可能是23:59:59.996
。不过,我记不得了(我已经很久没有处理过了)。如果是,您需要将dateadd(ms,-3,…)
更改为dateadd(ms,-4,…)
就时区而言,SQLServer2000对它们一无所知。对UTC也一无所知。日期时间值仅为自1900-01-01T00:00:00.000纪元以来的天数和小数天数计数
它代表UTC还是本地时间完全取决于系统的设置方式。如果日期/时间值来自用户或其他系统,则您的含义取决于数据源
就从东部标准时间(EST)到中部标准时间(CST)的转换而言,CST比东部时间早一个小时,所以只需减去一个小时即可得到东部标准时间:dateadd(hour,-1,@my_datetime_value)
应该这样做。如果你要处理夏时制(夏季)时间和标准时间之间的界限,它会变得[复杂得多],因为你需要知道日期/时间值的源轨迹,很可能还需要知道记录系统是否以任何方式规范了日期/时间值
例如,在2005年之前,印第安纳州表面上处于中央时区。然而,时区的选择——中央时区(UTC-6)或东部时区(UTC-7)——以及是否遵守夏令时,都是在逐县的基础上进行的。有些县喜欢复活节。虽然有些县没有实行夏令时,但大多数县没有。这实际上使这些县根据一年中的时间在中部时间和东部时间之间切换
2006年,印第安纳州通过了一项法律,对东部时区和夏时制的观测进行了[某种程度上]标准化……除了印第安纳州92个县中的18个在中央时间以外(7个在州的西北角,因为他们靠近芝加哥,也就是中部时间,11个在州的西南角,只是为了装腔作势,因为他们几乎什么都没有)。然后在2007年3月11日,普拉斯基县从中部时间改为复活节时间。不知道印第安纳州在他们之后做了什么
有关处理这类东西的困难的更多信息,请参阅和的[优秀!]一书。这本书有自己的网站:
如果我要解决这个问题,我会设计一些映射表,让我在给定日期/时间值和轨迹(如邮政编码或基本邮政编码)的情况下查找要进行的适当调整。美国邮政编码的前3位数字为城市或地区的基本邮政编码。例如,西雅图I的基本邮政编码s 98100
在表格中查找随时间变化的时区使用情况数据,无论该地点是否遵守夏令时,如果遵守夏令时,每个地点特定年份或年份范围的切换日期可能是一个挑战。我的帖子上面的where陈述是昨天的日期。AND“肯定有效…我需要添加另一个”AND“语句以搜索早于上午6:30、晚于7:15的时间…问题是我正在运行昨天日期的查询。(这将在windows计划程序运行的程序中),因此我始终需要“昨天”日期。@Shmewnix:Eh?我已经好几年没有处理SQL Server 2000了,但我不相信我正在对t-SQL做任何SQL Server 2000不知道的事情。不过,编辑后添加了两个缺少的变量声明。这很好!我对时间转换有点迷茫…我最初的想法是先转换DM_Corp_Receive_Date column到东部时间(我需要添加一个小时)我可以在查询中执行以下操作吗:选择Store_Id,DM_Corp_Received_Date as(dateadd(hour,+1,@My_Date_time))显然这不起作用……我对如何添加小时有点困惑。我需要显示实际打开的时间(东部时间不是中部时间).我算出来了。我只是在VB.net中为输出添加了小时。
@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