Sql 如何在CASE语句中使用多个DATEPART函数?

Sql 如何在CASE语句中使用多个DATEPART函数?,sql,sql-server,case,Sql,Sql Server,Case,表:我在SQL Server 2012中有一个数据库表TestingTable。这是表的外观: 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 Pot

表:我在SQL Server 2012中有一个数据库表TestingTable。这是表的外观:

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');
我有一个查询,仅当列的分钟值在26-30或56-00之间时才选择列1

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);
我的目标:现在我想将上述查询用作子查询。当给出FirstName(将具有唯一值)时,选择具有该名称的行,但仅当列的分钟值在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';
请建议我如何更正上述查询或编写另一个查询以实现我的目标。

这是什么

 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
选择
第1栏,
DATEPART(n,列)作为MyDatePart
,
[第1栏或第1栏]=
案例

当(DATEPART(n,column_ts)>25,DATEPART(n,column_ts)55和DATEPART(n,column_ts)时,尝试下面的查询

   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';
选择列,
第1列=
案例

当((日期部分(n,列)>25)和日期部分(n,列)>55)和日期部分(n,列)>在
案例
之后删除
。并且
其他
部分转换为
日期时间
,因为
when
返回一个
日期时间
。谢谢。您的解决方案非常适合我。我只需将当时的列替换为第1列。有没有简单的方法来获取0而不是NULL?I'l我将在进一步的过程中对该列求和,因此希望它为0而不是NULL。只需将NULL替换为0,就像更新的答案一样。最初我认为您使用的是column\u ts,这是一个datetime变量,这就是为什么将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
   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';