2016-10-07 3 views
1

테이블 : 당신은 사용하여이 테이블을 만들 수 있습니다 :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'); 

I를 나는 SQL 서버 2012에서 데이터베이스 테이블 TestingTable을이 테이블이 어떻게 보이는지되어 있습니다 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을 0으로 선택하십시오.

내가 시도한 것 : 나는 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

감사합니다. 귀하의 솔루션이 나를 위해 완벽하게 작동합니다. 난 그 다음에 column_ts를 THEN column1로 대체해야했습니다. NULL 대신에 0을 얻는 쉬운 방법이 있습니까? 추가 프로세스에서이 열을 요약 할 것이므로 NULL 대신 0을 원할 것입니다. – 300

+0

그냥 0으로 null로 대체, 업데이트 된 대답 .. 처음에 나는 당신이 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