SQL:使用函数/过程合并计算?

时间:2016-10-26 15:44:53

标签: sql function sql-server-2008 procedure

我有一段代码来调整表格的日期。

    dateadd(hh,
case
    when
        month(planned_start)=1 or
        month(planned_start)=2 or
        month(planned_start)=11 or
        month(planned_start)=12 then -5
    when
        month(planned_start)=3 then
            case
                when datepart(hh,planned_start)<6 then -5
            else -4
            end
    else -4
end
,planned_start)

基本上,我必须调整日期以获得时差,但我需要在SQL中的多个位置调整日期。现在,我只是将这段代码重复了大约8次。

有没有办法将它变成一个函数或过程,所以我可以将'planned_start'发送到函数,运行计算,并返回调整日期所需的'-4或-5'?

注意:我不相信我可以只使用变量,因为'planned_start'和小时偏移量可能每行数据不同。

感谢。

1 个答案:

答案 0 :(得分:1)

以下是查询的简化版

SELECT Dateadd(hh, CASE
                     WHEN Month(planned_start) IN ( 1, 2, 11, 12 )
                           OR ( Datepart(hh, planned_start) < 6
                                AND Month(planned_start) = 3 ) THEN -5
                     WHEN Month(planned_start) = 3
                          AND Datepart(hh, planned_start) >= 6 THEN -4
                     ELSE -4
                   END, planned_start) 

是的,您可以创建function并将其用于查询而不是重复大块代码

CREATE FUNCTION dbo.Dateadjust (@DATE DATETIME)
RETURNS DATETIME
AS
  BEGIN
      DECLARE @result DATETIME; -- previously it was int 

      SELECT @result = Dateadd(hh, CASE
                                     WHEN Month(@DATE) IN ( 1, 2, 11, 12 )
                                           OR ( Datepart(hh, @DATE) < 6
                                                AND Month(@DATE) = 3 ) THEN -5
                                     WHEN Month(@DATE) = 3
                                          AND Datepart(hh, @DATE) >= 6 THEN -4
                                     ELSE -4
                                   END, @DATE)

      RETURN( @result );
  END;

GO 

SELECT声明

中使用它
select planned_start,dbo.Dateadjust(planned_start)
From yourtable