Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 自定义日期范围_Sql_Sql Server_Sql Server 2008_Tsql_Date - Fatal编程技术网

Sql 自定义日期范围

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

解释

有两个工作班次,白班=从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-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
)