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