2016-04-08 4 views
2

このCASE文を変数として設定しようとしていますが、同じ日付が列に繰り返されています。この特定のCASEステートメントは夏時間の調整です。他のクエリでも使用していますが、一番上に変数を1つだけ持つことでこれらのクエリを短縮したいと考えています。SQL CASE変数

DECLARE @newdate as Datetime 

SELECT @newdate = 
CASE WHEN 
(a.REQDATE BETWEEN '2014-11-02' AND '2015-03-08' 
OR a.REQDATE BETWEEN '2015-11-01' AND '2016-03-13' 
OR a.REQDATE BETWEEN '2016-11-06' AND '2017-03-12' 
OR a.REQDATE BETWEEN '2017-11-05' AND '2018-03-11' 
OR a.REQDATE BETWEEN '2018-11-04' AND '2019-03-10') 
THEN  CONVERT(datetime,SWITCHOFFSET(CONVERT(datetimeoffset,a.REQDATE),'-08:00')) 
ELSE  CONVERT(datetime,SWITCHOFFSET(CONVERT(datetimeoffset,a.REQDATE),'-07:00')) 
END 

FROM TABLE a inner join TABLE b on a.REQDATE = b.REQDATE 


SELECT 
@newdate, b.REQDATE --control column 
FROM TABLE b 

結果:

(No column name)  | REQDATE 
2016-04-08 13:00:52.000 | 2015-11-02 15:41:25.000 
2016-04-08 13:00:52.000 | 2016-02-02 10:25:54.000 
2016-04-08 13:00:52.000 | 2016-02-11 12:59:10.000 

私はこれにいくつかの詳細情報を追加してみましょう。これにより

SELECT 
CASE WHEN (b.REQDATE BETWEEN '2014-11-02' AND '2015-03-08' 
OR b.REQDATE BETWEEN '2015-11-01' AND '2016-03-13' 
OR b.REQDATE BETWEEN '2016-11-06' AND '2017-03-12' 
OR b.REQDATE BETWEEN '2017-11-05' AND '2018-03-11' 
OR b.REQDATE BETWEEN '2018-11-04' AND '2019-03-10') 
THEN  CONVERT(datetime,SWITCHOFFSET(CONVERT(datetimeoffset,b.REQDATE),'-08:00')) 
ELSE CONVERT(datetime,SWITCHOFFSET(CONVERT(datetimeoffset,b.REQDATE),'-07:00')) END   AS "DateOpened" 
FROM TABLE 

:私は、次のコードを交換したい

SELECT 
@newdate 
FROM TABLE 

は、基本的にはその代わり@newDate変数のCASE文

+0

...関数にその場合ステートメントを移動しています。特にあなたの質問は何ですか? – dave

+1

'@ newdate'は単一値の変数です。複数の値を保持することはできません。 –

答えて

0

のうち変数を作成し、一時テーブルとインサートを宣言しますそれに記録する。完了したら、新しいテーブルのデータをテーブルbまたは結果を得るために必要なテーブルに挿入します。

3

変数には1つの値しか格納できません。何をする必要があるそれはあなたが求めているまさに不明だ

CREATE FUNCTION dbo.DST(@d datetime) 
RETURNS datetime 
AS 
BEGIN 
    RETURN CASE WHEN 
    (@d BETWEEN '2014-11-02' AND '2015-03-08' 
    OR @d BETWEEN '2015-11-01' AND '2016-03-13' 
    OR @d BETWEEN '2016-11-06' AND '2017-03-12' 
    OR @d BETWEEN '2017-11-05' AND '2018-03-11' 
    OR @d BETWEEN '2018-11-04' AND '2019-03-10') 
    THEN  CONVERT(datetime,SWITCHOFFSET(CONVERT(datetimeoffset,@d),'-08:00')) 
    ELSE  CONVERT(datetime,SWITCHOFFSET(CONVERT(datetimeoffset,@d),'-07:00')) 
    END 
END 
GO 

SqlFiddle