4

在我的一个项目中,我遇到了一个 sql 查询问题。实际上,我必须用三个班次检查某个表中的一个 DateTime 列,即,我必须根据各班次中的 RegisteredDateTime 列获取记录。我们有以下班次时间,班次将采用 24 小时制

Shift1 : 07:00:00-12:00:00
Shift2 : 12:00:00-22:00:00
Shift3 : 22:00:00-07:00:00

我的问题是我在 shift1 和 shift2 中正确获取记录,但记录不在 shift3 中。我正在四处走动,以解决这个问题。我正在使用以下搜索查询来获取所有班次中的记录

SELECT        RequestNumber
FROM            Table
WHERE (CONVERT(Time, RegisteredDateTime) BETWEEN '" & Shift1.Split("-")(0) &"' AND ' " & Shift1.Split("-")(1) & "') 

上面的查询用于 Shift1,同样我也在检查 Shift2 和 Shift3。

大家好,最后@AnandPhadke 给出的想法对我有用,这是我使用的最终查询

 Dim StartNumber As Integer = Convert.ToInt32(Shft3Arr(1).Split(":")(0))
 Dim EndShift As String = (StartNumber - 1) & ":59:59"
 query += "(CONVERT(Time, Complaints.RegisteredDateTime) >= '" + Shft3Arr(0) + "') OR  (CONVERT
(Time, DATEADD(DD, 1, Complaints.RegisteredDateTime)) <= '" + EndShift + "')"
4

4 回答 4

4

在这里做的最简单的事情就是改变时代(双关语)!

您的时间是 7-12,12-22,22-7*(7* 是第二天)

使用一点点魔法将它们转换为 0-5,5-15,15-24,这将匹配您正在测试的日期范围,对start of the shift吗?

SELECT RequestNumber
FROM   Table
WHERE  DateAdd(hh,-7,CONVERT(Time, RegisteredDateTime))
       BETWEEN ....

那,虽然在逻辑上不错不是 SARGABLE,所以我们改为移动范围,相反。

SELECT RequestNumber
FROM   Table
WHERE  CONVERT(Time, RegisteredDateTime)
       BETWEEN DateAdd(hh,7,@date1) AND DateAdd(hh,7,@date2)
于 2012-09-28T08:26:37.997 回答
2

班次 3 跨越 2 天。

在您的查询中添加这些条件

AND  CONVERT(Time,DATEADD(DD,1,RegisteredDateTime)) < '07:00:00'
AND  CONVERT(Time,RegisteredDateTime) > '07:00:00'
AND  DATEDIFF(DD,CONVERT(DATE,RegisteredDateTime), 
             CONVERT(Date,DATEADD(DD,1,RegisteredDateTime))) <=1

该答案基于上面的 Richard aka cyberkiwi答案。完全归功于他。如果这对您有用,请接受他的回答。

你的班次数据是这样的:

Shift1 : 07:00:00-12:00:00  
Shift2 : 12:00:00-22:00:00  
Shift3 : 22:00:00-07:00:00  

您需要做的只是根据班次时间设置@shift_start_time 和@shift_end_time

declare @shift_start_time time ;
 declare @shift_end_time time;

 IF shift 1:
 select @shift_start_time ='00:00:00'
 select @shift_end_time ='04:59:59'

 IF shift 2:
 select @shift_start_time ='05:00:00'
 select @shift_end_time ='14:59:59'

 IF shift 3:
 select @shift_start_time ='15:00:00'
 select @shift_end_time ='23:59:59'

SELECT RegisteredDateTime 
FROM   t_shift
WHERE  CONVERT(Time, DateAdd(hh,-7,  RegisteredDateTime))
       between @shift_start_time and  @shift_end_time
于 2012-09-28T08:14:12.297 回答
2

使用这些条件:

对于班次1

WHERE CONVERT(Time, RegisteredDateTime) > convert(time,'07:00:00') and CONVERT(Time, RegisteredDateTime) <= convert(time,'12:00:00')

对于班次2

WHERE CONVERT(Time, RegisteredDateTime) > convert(time,'12:00:00') and CONVERT(Time, RegisteredDateTime) <= convert(time,'22:00:00')

对于班次3

WHERE CONVERT(Time,RegisteredDateTime) > convert(time,'22:00:00') and CONVERT(Time,  DATEADD(DD,1,RegisteredDateTime)) <= convert(time,'06:59:59')
于 2012-09-28T08:16:52.717 回答
1

如果您在检索班次 1 和班次 2 的结果时没有遇到任何问题,那么班次 3 的结果只是通用集减去前 2 个查询的结果集。所以说查询 1 用于班次 1,查询 2 用于班次 2:那么您获取班次 3 的结果集的查询将是:

select resuestNumber from table where requestNumber not in (query 1) and requestNumber not in(query 2)
于 2012-09-28T12:07:50.863 回答