Sql 自定义日期范围
解释 有两个工作班次,白班=从07:00:00到19:00:00,夜班=从19:00:00到07:00:00 样本数据 期望结果 例如,我有@dateStart=2015-09-14和@dateEnd=2015-09-14变量。我需要选择2015-09-14 19:00:00到2015-09-15 07:00:00的以下记录:Sql 自定义日期范围,sql,sql-server,sql-server-2008,tsql,date,Sql,Sql Server,Sql Server 2008,Tsql,Date,解释 有两个工作班次,白班=从07:00:00到19:00:00,夜班=从19:00:00到07:00:00 样本数据 期望结果 例如,我有@dateStart=2015-09-14和@dateEnd=2015-09-14变量。我需要选择2015-09-14 19:00:00到2015-09-15 07:00:00的以下记录: John 2015-09-14 19:14:24 N John 2015-09-14 23:43:27 N John 2015-09-1
John 2015-09-14 19:14:24 N
John 2015-09-14 23:43:27 N
John 2015-09-15 03:21:36 N
如上所述,这里是日期2015-09-15,但时间是03:21:36,因此应该选择它,因为时间低于07:00:00,N工作班次
问题
我的查询按预期进行选择,但有两个问题
如果我通过@dateStart=2015-09-15和@dateEnd=2015-09-15,则选择:
John 2015-09-15 03:21:36 N -- this shouldn't be selected again, this should go as 2015-09-14
John 2015-09-15 11:29:48 D
另一个问题是,如果我有这样的记录
John 2015-09-15 03:21:36 N
正如您所见,2015-09-14中没有John的任何记录,因此当我在下面传递变量时,应该选择它:@dateStart=2015-09-15和@dateEnd=2015-09-15
质疑
如果有什么不清楚的地方-问我,我会尽力解释。在开始和结束时间上加上几个小时怎么样
where datetime >= dateadd(hour, 19, @datestart) and
datetime < dateadd(hour, 7, @dateend)
试试这个
select *
from SampleTable
where convert(dateTime,DateCreated) + convert(dateTime,StartTime)
between DATEADD(HH,7, @dateStart) and DATEADD(HH,24+7, @dateEnd)
or
(
convert(dateTime,DateCreated) + convert(dateTime,StartTime)
between DATEADD(HH,00, @dateStart) and DATEADD(HH,7, @dateStart) -- Morning records
and not exists
(
select 1 from SampleTable where
convert(dateTime,DateCreated) + convert(dateTime,StartTime)
between DATEADD(HH,7-24, @dateStart) and DATEADD(HH,0, @dateStart)
) -- Data from previous day
)
有一次,我在签到程序中遇到了类似的问题,我必须将时间戳与AM/PM一起使用,并进行检查以解决此问题。我认为这可能会对您有所帮助。为什么不进行检查。没有在日期数据类型中使用datetime值并将其存储为varchar的具体原因是什么?日期和时间是否存储为varchar?如果是这样的话,不要这样做,这会变得非常困难easier@Jamiec,不,它是DATETIME数据类型。那么为什么有两个不同的字段?两个都是datetime吗?谢谢你的回答,但似乎都错了。它在14天内返回相同的结果,在15天内返回相同的结果,如示例Got所示。每天你只需要日班和夜班。。。若并没有前一天的数据,那个么您需要为早晨的记录选择行。更新的解决方案谢谢,经过一些修改后看起来可以正常工作。
where datetime >= dateadd(hour, 19, @datestart) and
datetime < dateadd(hour, 7, @dateend)
where cast(date as datetime) + cast(time as datetime) >= dateadd(hour, 19, @datestart) and
cast(date as datetime) + cast(time as datetime) < dateadd(hour, 7, @dateend)
select *
from SampleTable
where convert(dateTime,DateCreated) + convert(dateTime,StartTime)
between DATEADD(HH,7, @dateStart) and DATEADD(HH,24+7, @dateEnd)
or
(
convert(dateTime,DateCreated) + convert(dateTime,StartTime)
between DATEADD(HH,00, @dateStart) and DATEADD(HH,7, @dateStart) -- Morning records
and not exists
(
select 1 from SampleTable where
convert(dateTime,DateCreated) + convert(dateTime,StartTime)
between DATEADD(HH,7-24, @dateStart) and DATEADD(HH,0, @dateStart)
) -- Data from previous day
)