Sql 检查时间是否介于两次之间(时间数据类型)

Sql 检查时间是否介于两次之间(时间数据类型),sql,tsql,Sql,Tsql,我有一个表,其中有一列“Created”作为datetime 我试图查询以检查创建值的时间是否介于两次之间 第一行的创建日期时间是“2013-07-01 00:00:00.000”(午夜),我正在尝试查询时间在晚上11点到早上7点之间的项目 select * from MyTable where CAST(Created as time) between '23:00:00' and '06:59:59' 但是没有返回结果 我需要将我的时间转换为日期时间吗?我想您应该检查它是在晚上11点之后还

我有一个表,其中有一列“Created”作为datetime

我试图查询以检查创建值的时间是否介于两次之间

第一行的创建日期时间是“2013-07-01 00:00:00.000”(午夜),我正在尝试查询时间在晚上11点到早上7点之间的项目

select *
from MyTable
where CAST(Created as time) between '23:00:00' and '06:59:59'
但是没有返回结果


我需要将我的时间转换为日期时间吗?

我想您应该检查它是在晚上11点之后还是早上7点之前:

选择*
从MyTable
where CAST(创建为时间)>=“23:00:00”
或演员(按时间创建)<'07:00:00'
这也应该有效(即使在SQL Server 2005中):

选择*
从dbo.MyTable
其中创建>=DATEADD(hh,23,DATEADD(day,DATEDIFF(day,0,Created-1),0))
并创建

应该是和,而不是或

select *
from MyTable
where CAST(Created as time) >= '23:00:00' 
   AND CAST(Created as time) < '07:00:00'
选择*
从MyTable
where CAST(创建为时间)>=“23:00:00”
和演员(按时间创建)<'07:00:00'

我遇到了一个非常类似的问题,希望与大家分享我的解决方案

给出此表(所有MySQL 5.6):

create table DailySchedule
(
id int自动递增主键,
开始时间不为空,
停止时间不为空
);
选择给定时间
x(hh:mm:ss)
在开始和停止时间之间的所有行。包括第二天

注意:随时用
x
替换
NOW()

选择id
从每日时间表
哪里
(开始时间<停止时间和现在()介于开始时间和停止时间之间)
或
(停止时间<开始时间和现在()<开始时间和现在()<停止时间)
或
(停止时间<开始时间>现在()>开始时间)
结果

给定

  • 所选行的
    NOW=09:00:00
    2
  • 所选行的
    NOW=14:00:00
    1
  • 所选行的
    NOW=11:00:00
    1,2
  • 所选行的
    NOW=20:00:00
    :无

让我们考虑一个存储移位细节

的表。

请检查SQL查询以生成表,并根据输入(时间)查找计划

声明表变量

declare @MyShiftTable table(MyShift int,StartTime time,EndTime time)
insert into @MyShiftTable select 1,'01:17:40.3530000','02:17:40.3530000'
insert into @MyShiftTable select 2,'09:17:40.3530000','03:17:40.3530000'
insert into @MyShiftTable select 3,'10:17:40.3530000','18:17:40.3530000'
向表变量添加值

declare @MyShiftTable table(MyShift int,StartTime time,EndTime time)
insert into @MyShiftTable select 1,'01:17:40.3530000','02:17:40.3530000'
insert into @MyShiftTable select 2,'09:17:40.3530000','03:17:40.3530000'
insert into @MyShiftTable select 3,'10:17:40.3530000','18:17:40.3530000'
使用名为“Flag”的附加字段创建另一个表变量

通过交换开始和结束时间向临时表添加值

插入@Temp选择MyShift,case when(StartTime>EndTime)然后EndTime else StartTime end,case when(StartTime>EndTime)然后StartTime else EndTime end,case when(StartTime>EndTime)然后1 else 0结束@MyShift表

创建输入变量以查找移位

declare @time time=convert(time,'10:12:40.3530000')
查询以查找与提供的时间对应的班次

从@Temp中选择myShift,其中
(@time介于StartTime和EndTime之间,并且 标志=0)或(@time不在开始时间和结束时间之间,且标志=1)

请检查这个


类似的问题有一个例子[here][1][1]:是的,在晚上11点到第二天早上7点之间实际上,不一定要在两天之间。我有一张员工轮班的桌子。第三班的开始时间为23:00:00(晚上11点),结束时间为06:59:59。这两个数据都存储为“时间”数据类型。@t-clausen.dk:在同一天的23小时和7小时之间没有多大意义,因为第一个时间晚于第二个时间,结果集总是空的。@TimSchmelter我不想就此争论,所以我删除了我的帖子。我的逻辑告诉我这并不重要。在本例中,我是对的,但是我看到其他senarios对您的问题有很好的回答,但这仅适用于SQL server 2008和New。如果您希望根据日期将项目分组,您还需要非常小心。如果今天早上6点打包的话,它将与今晚11:30打包的其他东西组合在一起。如果您需要根据日期分组,我建议您增加一个小时或减去七个小时,然后根据需要执行计算。如果您希望在07:00和23:00之间进行检查,那么这种逻辑将不起作用,因为时间范围将随时间而变化,这取决于this@George:那么情况就不同了,需要不同的代码。不过,应该很容易判断哪种情况适用。@JonSkeet“感谢十亿”问题中没有
?时间永远不能小于
7:00
,也不能大于
23:00
,因此
会导致返回0条记录,无论发生什么情况。回答旧问题时,如果您包含一些上下文来解释您的答案是如何有帮助的,特别是对于已经有公认答案的问题,那么您的答案对其他StackOverflow用户会更有用。请参阅:。
insert into @MyShiftTable select 1,'01:17:40.3530000','02:17:40.3530000'
insert into @MyShiftTable select 2,'09:17:40.3530000','03:17:40.3530000'
insert into @MyShiftTable select 3,'10:17:40.3530000','18:17:40.3530000'
declare @Temp table(MyShift int,StartTime time,EndTime time,Flag int)
declare @time time=convert(time,'10:12:40.3530000')
WITH CTE as
(
SELECT CAST(ShiftStart AS DATETIME) AS ShiftStart, 
CASE WHEN ShiftStart > ShiftEnd THEN CAST(ShiftEnd AS DATETIME) +1
ELSE CAST(ShiftEnd AS DATETIME) END AS ShiftEnd
FROM **TABLE_NAME**
)
SELECT * FROM CTE
WHERE 
CAST('11:00:00' AS DATETIME) BETWEEN ShiftStart AND ShiftEnd -- Start of Shift
OR CAST('23:00:00' AS DATETIME) BETWEEN ShiftStart AND ShiftEnd -- End of Shift
select * from dbMaster oMaster  where ((CAST(GETDATE() as time)) between  (CAST(oMaster.DateFrom as time))  and  
(CAST(oMaster.DateTo as time)))