SQL SERVER 2008在两个日期和两次之间过滤

时间:2016-01-15 18:28:34

标签: sql-server ssrs-2012

我有一个名为“Date_Entered”的DateTime列,我需要在两个日期之间进行过滤,并在这两个日期之间过滤两次(时间可能是第二天)。这是我的疑问:

Declare @StartDate DateTime 
Declare @EndDate DateTime 
Declare @StartTime varchar(8) 
Declare @EndTime varchar(8)

SELECT Date_Entered FROM MyTable
WHERE (Date_Entered BETWEEN '1/1/2014' AND '1/1/2015')
AND (CONVERT(varchar(8), Date_Entered, 108) >= '21:00:00' OR @StartTime IS NULL)
AND (CONVERT(varchar(8), Date_Entered, 108) <= '03:00:00' OR @EndTime IS NULL) --This time value is on the next day to cover a 6-hour period

所需结果应显示日期范围内(2014年)的所有值,并显示在6小时范围内(夜间):

2014-05-15 21:09:00
2014-08-12 02:45:00
2014-09-05 01:40:00

上述所有情况均发生在日期范围(2014年)和第二天晚上9点至凌晨3点之间。 我的问题是我需要搜索第二天晚上9点和凌晨3点(相同日期范围)发生的时间

如果我在同一天搜索时间范围,比如从21:00到23:59,我会得到结果,但是当第二天的时间结束时,我就不会得到任何结果。 知道如何在SQL中做到这一点。

SSRS 2012用于输入参数值。

Date_Entered字段是具有日期和时间的DateTime类型。

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题,那么下面的代码将给出正确的输出

create table a
(enddate datetime
)
insert into a values ('2014-05-15 21:09:00')
insert into a values ('2014-08-12 02:45:00')
insert into a values ('2014-09-05 01:40:00')

查询

SELECT enddate FROM a
WHERE (enddate BETWEEN '1/1/2014' AND '1/1/2015')
AND (CONVERT(varchar(8), enddate, 108) >= '21:00:00' )
or (CONVERT(varchar(8), enddate, 108) <= '03:00:00' )

结果

May, 15 2014 21:09:00
August, 12 2014 02:45:00
September, 05 2014 01:40:00

答案 1 :(得分:0)

您是否可以将单独的日期和时间字段转换为单个日期时间字段?这是指向相关SO问题的链接,提供了将搜索条件转换为单个字段的选项。通过这样做,它应该让您在单个查询中搜索超过午夜的时间。

SQL Server convert string to datetime