2016-10-07 8 views
1

表:私はこのテーブルがどのように見えるかであるSQL Serverの2012年にデータベーステーブルTestingTableを持っている:CASE文で複数のDATEPART関数を使用するには?

column_ts    column1 FirstName LastName 
2016-09-30 00:04:00.000 5  Martha  Stuart 
2016-09-30 00:24:00.000 51  Tom   Riddle 
2016-09-30 00:29:00.000 32  Harry  Potter 
2016-09-30 00:44:00.000 128  Anderson Smith 
2016-09-30 00:48:00.000 23  Lisa  Young 
2016-09-30 01:04:00.000 88  Mad   Max 
2016-09-30 01:59:00.000 46  Sam   King 

DDL:あなたが使用してこの表を作成することができます。

CREATE TABLE TestingTable 
(
column_ts datetime, 
column1 int, 
FirstName varchar(255), 
LastName varchar(255) 
); 

INSERT INTO TestingTable 
VALUES ('2016-09-30 00:04:00.000',5,'Martha','Stuart'), 
('2016-09-30 00:24:00.000',51,'Tom','Riddle'), 
('2016-09-30 00:29:00.000',32,'Harry','Potter'), 
('2016-09-30 00:44:00.000',128,'Anderson','Smith'), 
('2016-09-30 00:48:00.000',23,'Lisa','Young'), 
('2016-09-30 01:04:00.000',88,'Mad','Max'), 
('2016-09-30 01:04:00.000',46,'Sam','King'); 

私はcolumn_tsに26-30または56-00の間の分の値がある場合にのみ、column1を選択するクエリがあります。

select ISNULL(column1,0) from TestingTable 
     where ((DATEPART(n, column_ts) > 25) AND DATEPART(n, column_ts) <= 30) 
     OR (((DATEPART(n, column_ts) > 55) AND DATEPART(n, column_ts) <= 59) OR DATEPART(n, column_ts) = 0); 

結果は次のようになります。

(No column name) 
32 
46 

私の目標:今、私はサブクエリとして上記のクエリを使用します。 FirstName(一意の値を持つ)が指定されている場合、その名前を持つ行を選択しますが、column_tsには26-30または56-00の間の分の値がある場合のみcolumn1の値を選択します。そうでない場合は、column1をゼロとして選択します。

私が試したこと:私はCASEを使用する必要があると思いますが、CASEでは括弧を使用できない/使用しないでください。私はそれのために構文エラーを取得しますが、何かを試してみました:

select column_ts, column1 = 
    CASE column_ts 
     WHEN (((DATEPART(n, column_ts) > 25) AND DATEPART(n, column_ts) <= 30) 
      OR (((DATEPART(n, column_ts) > 55) AND DATEPART(n, column_ts) <= 59) OR DATEPART(n, column_ts) = 0)) THEN column_ts 
     ELSE 0  
    END, FirstName, LastName 
from TestingTable 
where FirstName = 'Tom'; 

エラー:クエリ上記は、構文エラーを与える:

Msg 102, Level 15, State 1, Line 3 
Incorrect syntax near '>'. 
Msg 102, Level 15, State 1, Line 4 
Incorrect syntax near 'DATEPART'. 

達成するために、私は上記のクエリを修正するか、別のクエリを書くことができますどのように私を提案してください。私の目標。

+1

'case'の後に' colum_ts'を削除します。 'when'が' datetime'を返すので 'else'部分を' datetime'として 'cast'します。 –

答えて

1

次のクエリを試してみてください。

SELECT column_ts, 
    column1 = 
    CASE 
    WHEN (((DATEPART(n, column_ts) > 25) AND DATEPART(n, column_ts) <= 30) 
     OR (((DATEPART(n, column_ts) > 55) AND DATEPART(n, column_ts) <= 59) OR DATEPART(n, column_ts) = 0)) THEN column1 
    ELSE 0 
END, FirstName, LastName 
FROM TestingTable 
WHERE FirstName = 'Tom'; 
+0

ありがとうございます。あなたのソリューションは私にとって完璧に機能します。私はちょうどTHEN column_tsをTHEN column1に置き換えなければなりませんでした。 NULLの代わりに0を得る簡単な方法はありますか?私はさらなるプロセスでこの列を要約するので、NULLの代わりに0が必要になります。 – 300

+0

更新された答えのようにnullを0に置き換えてください。最初はあなたがcolumn_tsを使用していると思っていました。これはdatetime変数です。なぜ0の代わりにNULLを置くのですか? –

0

これは?

select 
column1, 
DATEPART(n, column_ts) as MyDatePart 
, 
[Column1OrBust] = 
case 
    when (DATEPART(n, column_ts) > 25 AND DATEPART(n, column_ts) <= 30) OR (DATEPART(n, column_ts) > 55 AND DATEPART(n, column_ts) <= 59) then column1 
    else 0 
end 
, FirstName, LastName 
from TestingTable 
関連する問題