2016-10-07 6 views
1

Таблица: У меня есть таблица базы данных TestingTable в SQL Server 2012. Это как таблица выглядит следующим образом:Как использовать несколько функций DATEPART в инструкции CASE?

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 есть запрос, который выбирает column1 только в том случае, если column_ts имеет минутное значение между 26-30 OR 56-00.

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 (будет иметь уникальные значения), выберите строку с таким именем, но выберите значение column1, только если значение column_ts имеет значение минус 26-30 ИЛИ 56-00. Else выберите столбец1 как ноль.

Что я пытался: Я думаю, что мне придется использовать 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

удалить 'colum_ts' после' case'. а также 'cast'' else' как 'datetime', потому что' when' возвращает 'datetime'. –

ответ

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 колонкой THEN1. Есть ли простой способ получить 0 вместо NULL? Я буду суммировать этот столбец в дальнейшем процессе, поэтому ему нужно будет 0 вместо NULL. – 300

+0

просто замените нуль на 0, как и обновленный ответ. Сначала я думал, что вы используете column_ts, и это переменная datetime, поэтому ставьте NULL вместо 0. –

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