2017-05-04 25 views
1

获得价值我有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 

下面是如何执行的是SP与帕拉姆

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

与此存储过程的问题是case when显示近端提示,“incorrect syntax near end

+0

我想你可能会有点困惑如何既case语句和变量在SQL中工作。我相信你正在试图从你的表格中获取某个日期列的小时数在一定范围内的数据。你能否澄清一下日期栏是什么,并可能提供一些样本数据? – ZLK

回答

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 

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

1

WHEN是要评估的条件,那么就是结论。

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 
0

不要使用@符号:

来自:

end as @shift 

到:

end as shift