2016-04-11 7 views
2

smalldatetimeにキャストしようとしています。行の日付値がsmalldatetimeの範囲外の場合は、日付をデフォルト値に設定します。許可された最大の日付とまだ私の比較を行います。キャスト()がsmalldatetimeに失敗した場合のデフォルト値

SELECT Sum(Case When Cast(shph.datetoship as smalldatetime) < @day1datetoship Then shpd.ordered Else 0 End) as TotDemandPast 
FROM shipments shph 
WHERE shph.pending = 1; 

shph.datetoshipはインスタンス2080-01-11 00:00:00.000、 のためであるとき、だから私はそれが@day1datetoshipに比べ2079-06-06 00:00:00.000、その後に変更します。

これを行うにはシンプルでエレガントな方法がありますか?

更新

よりテストの後、2つの答えはいくつかの問題を与えることを証明しました。 最後に、別のCaseステートメントをCast内に置くことによって問題を解決しました。

最終的なコード:

SELECT Sum(Case When Cast(Case WHEN shph.datetoship > '2079-06-06 00:00:00' THEN '2079-06-06 00:00:00' Else shph.datetoship END as smalldatetime) < @day1datetoship Then shpd.ordered Else 0 End) as TotDemandPast 
FROM shipments shph 
WHERE shph.pending = 1; 
+0

を照会し、あなたの比較をしますか? – David

+0

datetimeからsmalldatetimeへのキャストに範囲外の問題はありません。私はvarcharからsmalldatetimeにキャストしていると推測しています。そして "私はそれが2079-06-06に変更されたかった"という感覚を得ていません=/ –

+0

代わりにdatetimeに変数をキャストしてみませんか? – UnhandledExcepSean

答えて

1

あなたはTry_Parse構文を使用して、このクエリを試すことができます。 `DateTime`にすべてを変換しないのはなぜあなたは、次を使用することができ、これはSQLサーバ(2012以上)の新しいバージョンで使用されていることに注意してくださいSQLサーバーの下位バージョンの

SELECT 
    Sum(
     Case 
     When ISNULL(Try_parse(shph.datetoship as smalldatetime),'2079-06-06') < @day1datetoship 
     Then shpd.ordered 
     Else 0 
     End 
    ) as TotDemandPast 
FROM shipments shph 
WHERE shph.pending = 1; 

SELECT 
    Sum(
     Case 
     When 
     ( 
     shph.datetoship >='1900-01-01' AND 
     shph.datetoship <='2079-06-06' AND 
     CAST(shph.datetoship as smalldatetime) < @day1datetoship 
     ) OR 
     ('2079-06-06' < @day1datetoship) 
     Then shpd.ordered 
     Else 0 
     End 
    ) as TotDemandPast 
FROM shipments shph 
WHERE shph.pending = 1; 
+0

ありがとうございました!これはSQL Server 2008 R2で動作しているようです。 –

1
DECLARE @shipments TABLE(
    datetoship DATETIME, 
    pending BIT, 
    ordered BIT 
) 

INSERT INTO @shipments SELECT '1899-01-01',1,1 
INSERT INTO @shipments SELECT '1900-01-01',1,1 
INSERT INTO @shipments SELECT '2079-06-06',1,1 
INSERT INTO @shipments SELECT '2079-06-07',1,1 

DECLARE @day1datetoship SMALLDATETIME='04/11/2016' 

SELECT 
    Sum(
     Case 
      WHEN shph.datetoship>='1900-01-01' and shph.datetoship<='2079-06-06 23:59' THEN 
       CASE 
        WHEN Cast(shph.datetoship as smalldatetime) < @day1datetoship then shph.ordered 
        Else 0 
       END 
      When '2079-06-06' < @day1datetoship Then shph.ordered 
      Else 0 
     End 
    ) as TotDemandPast 
FROM @shipments shph 
WHERE shph.pending = 1; 
+0

これもうまくいきましたが、選択された答えはこれをより少ないステップで実行しました。ありがとうございます@Ghost –

関連する問題