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_Date_Datetime - Fatal编程技术网

Sql 根据开始和结束时间之间的当前时间选择班次

Sql 根据开始和结束时间之间的当前时间选择班次,sql,sql-server,date,datetime,Sql,Sql Server,Date,Datetime,我想在开始时间和结束时间之间选择使用当前时间的班次 根据您的问题,您可以尝试使用CASTCASTGETDATE作为时间作为日期时间,将日期设置为1900-01-01时间我们只比较时间值 检查夜需要使用一点技巧,因为值会跨越日期 当GETDATE时间介于“00:00:00”和“08:00:00”之间时表示交叉日期。 所以我们需要为CASTCASTGETDATE添加一个日期作为DATETIME的时间 问题1: : 一个简单的中间条款不足以处理午夜案件。你可以这样做: SELECT * FROM sh

我想在开始时间和结束时间之间选择使用当前时间的班次


根据您的问题,您可以尝试使用CASTCASTGETDATE作为时间作为日期时间,将日期设置为1900-01-01时间我们只比较时间值

检查夜需要使用一点技巧,因为值会跨越日期

当GETDATE时间介于“00:00:00”和“08:00:00”之间时表示交叉日期。 所以我们需要为CASTCASTGETDATE添加一个日期作为DATETIME的时间

问题1:

:

一个简单的中间条款不足以处理午夜案件。你可以这样做:

SELECT *
FROM shifts
CROSS APPLY (
    SELECT CONVERT(DATETIME, CONVERT(VARCHAR(8), GETDATE(), 108)) AS CurrTime
) AS ca
WHERE
    (EndTime > StartTime AND CurrTime >= StartTime AND CurrTime < EndTime) OR
    (EndTime < StartTime AND (CurrTime < EndTime OR CurrTime >= StartTime));

假设StartTime和EndTime是datetime数据类型

declare @now datetime

-- this will convert current date time to 1900-01-01 + time
select @now = convert(datetime, convert(time, getdate()))

select  *
from    @shift s
where   @now >= StartTime
and     @now <  case when StartTime < EndTime 
                     then EndTime 
                     else dateadd(day, 1, EndTime) 
                     end

这比你想象的要复杂得多。注意,i OP的日期为1900-01-01,ii注意最后一条记录。。。夜班在午夜之前开始,在午夜之后结束。当我使用你的查询1:那么我面临一些错误选择t1。*从t1交叉应用选择CASTCASTGETDATE作为时间作为DATETIME nowDt,当ShiftName='Night'然后EndTime+1 ELSE EndTime END EndTime v时的情况,其中nowDt在StartTime和v之间。EndTime@D-Shih错误为Msg 170,级别15,状态1,第2行第2行:“应用”附近的语法不正确。Msg 170,级别15,状态1,第12行第12行:“v”附近的语法不正确。您的sql server版本是什么?sql 2005 ExpressTiny更正:@现在请参阅修订后的答案。如果交叉应用不可用,只需声明一个变量并在查询中使用它declare@CurrTime AS DATETIME=CONVERTVARCHAR8,GETDATE,108。
SELECT t1.*
FROM T t1
WHERE   
   CASE WHEN CONVERT(datetime,CONVERT(varchar(8),GETDATE(),108))  BETWEEN CONVERT(DATETIME,'00:00:00') AND CONVERT(DATETIME,'00:08:00') 
             THEN CONVERT(datetime,CONVERT(varchar(8),GETDATE(),108))  + 1
             ELSE CONVERT(datetime,CONVERT(varchar(8),GETDATE(),108)) 
   END
         BETWEEN StartTime 
   AND 
         CASE WHEN ShiftName = 'Night' 
            THEN EndTime + 1 
            ELSE EndTime
         END 
| ShiftID | OrgID | ShiftName |            StartTime |              EndTime |
|---------|-------|-----------|----------------------|----------------------|
|      13 |   1-1 |   General | 1900-01-01T09:00:00Z | 1900-01-01T17:00:00Z |
|      14 |   1-2 |   Morning | 1900-01-01T08:00:00Z | 1900-01-01T15:00:00Z |
SELECT *
FROM shifts
CROSS APPLY (
    SELECT CONVERT(DATETIME, CONVERT(VARCHAR(8), GETDATE(), 108)) AS CurrTime
) AS ca
WHERE
    (EndTime > StartTime AND CurrTime >= StartTime AND CurrTime < EndTime) OR
    (EndTime < StartTime AND (CurrTime < EndTime OR CurrTime >= StartTime));
declare @now datetime

-- this will convert current date time to 1900-01-01 + time
select @now = convert(datetime, convert(time, getdate()))

select  *
from    @shift s
where   @now >= StartTime
and     @now <  case when StartTime < EndTime 
                     then EndTime 
                     else dateadd(day, 1, EndTime) 
                     end