存储过程中的日期和班次类型筛选器

wztqucjr  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(365)

我使用的是sql server 2016,我有一个传感器表,如下所示:
传感器代码传感器状态时间戳PS01AActive2019-11-20 01:38:11.850ps01bactive2019-11-20 02:30:09.850ps01cactive2019-11-20 05:32:11.004PS01活动2019-11-20 07:38:07.997ps01eactive2019-11-20 11:38:06.700
在存储过程中,如何使用日期和班次类型作为输入参数来筛选上面的表?我可以查询筛选日期,但不能查询班次类型。
对于班次类型,请使用下表作为参考:
班次类型StartTimeEndTimeDay06:00:0017:59:59夜间18:00:0005:59:59
这是我的密码

  1. ALTER PROCEDURE [dbo].[GET_SENSOR_STATE]
  2. @date DATE,
  3. @shifttypeid INT,
  4. @shifttype NVARCHAR(MAX)
  5. AS
  6. BEGIN
  7. SET NOCOUNT ON;
  8. IF (@shifttype = 'DAY')
  9. SET @shifttypeid = 0
  10. ELSE
  11. SET @shifttypeid = 1
  12. SELECT [SensorCode]
  13. ,[SensorStatus]
  14. ,[Timestamp]
  15. FROM [MyTable].[dbo].[SensorState] SS
  16. WHERE
  17. --@date = CAST(SS.Timestamp AS DATE)
  18. CASE @shifttypeid
  19. WHEN 0 THEN @date = CAST(SS.Timestamp AS DATE) AND DATEPART(HH, SS.Timestamp) BETWEEN 6 AND 18
  20. WHEN 1 THEN @date = CAST(SS.Timestamp AS DATE) AND DATEPART(HH, SS.Timestamp) BETWEEN 18 AND 6
  21. END
  22. END
thtygnil

thtygnil1#

你不能使用 BETWEEN 18 AND 6 这永远不会是真的。也适用于 BETWEEN ,检查条件包含在内 BETWEEN 6 AND 18 意志意味着 >= 6 AND <= 18 这不是你想要的。最好使用 >= 以及 < ```
WHERE (
CAST(SS.Timestamp AS DATE) = @date
OR (
@shifttypeid = 1
AND CAST(SS.Timestamp AS DATE) = DATEADD(DAY, 1, @date)
)
)
AND (
( -- Day Shift
@shifttypeid = 0
AND DATEPART(HH, SS.Timestamp) >= 6
AND DATEPART(HH, SS.Timestamp) < 18
)
OR ( -- Night Shift
@shifttypeid = 1
AND (
DATEPART(HH, SS.Timestamp) < 6
OR DATEPART(HH, SS.Timestamp) >= 18
)
)
)

  1. 要处理的附加条件 `Night Shift` 日期
  2. 编辑:基于 `@shifttypeid` 筛选所需的 `Timestamp` 相应地。

WHERE ( -- Day Shift 06:00 to 18:00
@shifttypeid = 0
AND SS.Timestamp >= DATEADD(HOUR, 6, CAST(@date AS DATETIME))
AND SS.Timestamp < DATEADD(HOUR, 18, CAST(@date AS DATETIME))
)
OR ( -- Night Shfit 18:00 to 06:00
@shifttypeid = 1
AND SS.Timestamp >= DATEADD(HOUR, 18, CAST(@date AS DATETIME))
AND SS.Timestamp < DATEADD(HOUR, 30, CAST(@date AS DATETIME))
)

展开查看全部

相关问题