如何根据工作班次获得价值

时间:2017-05-04 01:14:47

标签: sql-server tsql datetime stored-procedures

我有3个主要转变

08:00~16:00是S1
16:00~24:00是S2
00:00~08:00是S3

我必须根据上面的3班获得所有数据,现在我正在创建一个存储过程来检索基于3班的所有数据。

    ALTER PROCEDURE sp_shift
(
    @V2_WORK_DATE DATETIME,
    @V3_SHIFT_NO VARCHAR(2)
)

AS
    DECLARE @shift VARCHAR(5);

        select t3.scn,t3.vsl_name, t1.qty, t1.opr_type, t1.hatch_num,t1.opr_st_dt_tm,t1.opr_ed_dt_tm,t1.wght,t1.vol,t2.description,t3.disc_load,

        case when @V3_SHIFT_NO = 'S1' THEN DATEPART(HH,@V2_WORK_DATE)> = 8 AND DATEPART(HH, @V2_WORK_DATE) <16
             when @V3_SHIFT_NO = 'S2' THEN DATEPART(HH,@V2_WORK_DATE)> = 16 AND DATEPART(HH, @V2_WORK_DATE) <24
             when @V3_SHIFT_NO = 'S1' THEN DATEPART(HH,@V2_WORK_DATE)> = 8 AND DATEPART(HH, @V2_WORK_DATE) <16 end as @shift
        from ccostsitem t1
        inner join ccoscargotype t2 on t2.code = t1.cg_type_id
        inner join ccostallysheet t3 on t3.id = t1.master_id
        where @shift = @V3_SHIFT_NO

下面是我用spram执行sp的方法

EXEC sp_shift '2016-12-30 08:00:00.000','S1'

此存储过程存在的问题是case when显示“incorrect syntax near end”附近的提示错误

3 个答案:

答案 0 :(得分:1)

什么是待评估的条件,那就是结论。

SELECT *
FROM (SELECT t3.scn
   , t3.vsl_name
   , t1.qty
   , t1.opr_type
   , t1.hatch_num
   , t1.opr_st_dt_tm
   , t1.opr_ed_dt_tm
   , t1.wght 
   , t1.vol
   , t2.description
   , t3.disc_load
   , CASE WHEN DATEPART(HH,@V2_WORK_DATE)> = 8 AND DATEPART(HH, @V2_WORK_DATE) <16 THEN 'S1'
         WHEN DATEPART(HH,@V2_WORK_DATE)> = 16 AND DATEPART(HH, @V2_WORK_DATE) <24  THEN 'S2'
         WHEN DATEPART(HH,@V2_WORK_DATE)> = 8 AND DATEPART(HH, @V2_WORK_DATE) <16 THEN 'S3' END AS Shift
    FROM ccostsitem t1
    INNER JOIN ccoscargotype t2 on t2.code = t1.cg_type_id
    INNER JOIN ccostallysheet t3 on t3.id = t1.master_id
    ) a
 WHERE Shift = @V3_SHIFT_NO

答案 1 :(得分:0)

您希望将变量=设置为CASE语句,而不是使用AS。 AS是别名命令,需要一个列(在本例中)。这应该有效:

@shift = case when @V3_SHIFT_NO = 'S1' THEN DATEPART(HH,@V2_WORK_DATE)> = 8 AND DATEPART(HH, @V2_WORK_DATE) <16
              when @V3_SHIFT_NO = 'S2' THEN DATEPART(HH,@V2_WORK_DATE)> = 16 AND DATEPART(HH, @V2_WORK_DATE) <24
              when @V3_SHIFT_NO = 'S1' THEN DATEPART(HH,@V2_WORK_DATE)> = 8 AND DATEPART(HH, @V2_WORK_DATE) <16 end 

编辑:实际上,在第二次审核时,您的查询可能需要一些额外的帮助,但希望它可以让您朝着正确的方向前进。

答案 2 :(得分:0)

不要使用@ sign:

从:

end as @shift

为:

end as shift