我想从数据库中检索符合以下规范的数据。
当前变量为:日期和班次
我想检索等于今天日期的数据,并且班次等于“C”
我确实得到了结果,但接下来就出现了问题:
我也从前一天的“C”班次获得结果
原因是因为这些变化如下......
Shift A = 05:45 - 13:45
Shift B = 13:45 - 21:45
Shift C = 21:45 - 05:45
这意味着我得到前一天的数据,因为前一班次C的日期相同,因为它重叠了2天
如何编写查询以仅检索特定C班次的数据?
我目前的查询是:
SELECT * FROM Data WHERE Shift = currentshift AND Date = todayDate
答案 0 :(得分:2)
我相信你想要的是:
SELECT d.*
FROM Data d
WHERE CAST(@DATE as TIME) >= '21:45:00') OR
CAST(@DATE as TIME) <= '05:45:00')
您还需要一个日期条件。我不确定您的数据是什么样的。
答案 1 :(得分:0)
试试这个, 我假设您想要按时间过滤,而不是按日期过滤,因此您的SQL查询将是这样的
IsNull(LEFT(CONVERT(TIME(0),Shift ),5),'00:00') > @startTime and
IsNull(LEFT(CONVERT(TIME(0),Shift ),5),'00:00') < @endTime
已更新:
另一种方法是创建动态查询,并根据条件追加where子句
DECLARE @currentshift nvarchar(150);
DECLARE @SQL nvarchar(max);
DECLARE @todayDate datetime;
--set @todayDate=getdate();
--set @Date=GETDATE();
--set @currentshift='shift c'
Set @SQL=N'SELECT * FROM Data WHERE Shift='''+@currentshift+'''';
IF (@currentshift ='21:45 - 05:45')
begin
set @SQL =@SQL+ ' and [Date] >='''+ CONVERT(VARCHAR(10),@todayDate, 101)+''' and [Date] <='''+ CONVERT(VARCHAR(10),DATEADD(DAY,1,''+@todayDate+''), 101)+'''';
end
ELSE
begin
set @SQL =@SQL+ ' and [Date] ='''+ CONVERT(VARCHAR(10),@todayDate, 101)+'''';
end
-- print @SQL
exec sp_executesql @SQL