2016-01-20 95 views
1

我正在使用WHERE子句中包含CASE语句的查询,其中我必须将日期列与来自日期和toDate的两个变量(如果它不为空)进行比较。但是,SQL Server 2008在执行时会给出一些错误,例如“附近的语法错误>”。任何人都可以请帮助我正确的查询?下面是该查询:SQL Server 2008中的WHERE子句中的日期比较的CASE语句

declare 
@fromDate varchar(32)= '2015-08-04', 
@toDate varchar(32) = '2016-01-04' 

SELECT 
DC_MASTER.DC_NO, 
PSR_LOAD_DATE_TIME, 
CUS_NAME 
FROM DC_ITEM 
INNER JOIN DC_MASTER ON DC_MASTER.DC_NO=DC_ITEM.DC_NO 
INNER JOIN ITEM_MASTER ON item_master.ITEM_CODE = DC_ITEM.ITEM_CODE 
INNER JOIN CUSTOMER_MASTER ON customer_master.CUS_CODE = DC_MASTER.CUS_CODE 
INNER JOIN LOCATION_MASTER ON location_master.LOC_CODE = DC_ITEM.LOC_CODE 
WHERE DC_ITEM.ITEM_CODE=item_master.ITEM_CODE 
AND CASE 
WHEN @fromDate IS NOT NULL AND @toDate IS NOT NULL THEN DC_MASTER.PSR_LOAD_DATE_TIME >= @fromDate and PSR_LOAD_DATE_TIME <= @toDate 
END 
+1

这是一个case表达式(返回一个值),而不是case语句(有条件的代码执行)。 – jarlh

+0

你能否给我正确的使用方法。实际上,如果提供的话,我需要在这两个日期之间得到记录。 –

回答

1

您可以轻松地把它变成一个正常的where条件,而不是情况:

declare 
@fromDate varchar(32)= '2015-08-04', 
@toDate varchar(32) = '2016-01-04' 

SELECT 
DC_MASTER.DC_NO, 
PSR_LOAD_DATE_TIME, 
CUS_NAME 
FROM DC_ITEM 
INNER JOIN DC_MASTER ON DC_MASTER.DC_NO=DC_ITEM.DC_NO 
INNER JOIN ITEM_MASTER ON item_master.ITEM_CODE = DC_ITEM.ITEM_CODE 
INNER JOIN CUSTOMER_MASTER ON customer_master.CUS_CODE = DC_MASTER.CUS_CODE 
INNER JOIN LOCATION_MASTER ON location_master.LOC_CODE = DC_ITEM.LOC_CODE 
WHERE DC_ITEM.ITEM_CODE=item_master.ITEM_CODE 
AND ((@fromDate IS NOT NULL AND @toDate IS NOT NULL and DC_MASTER.PSR_LOAD_DATE_TIME >= @fromDate 
and PSR_LOAD_DATE_TIME <= @toDate) or @fromDate IS NULL or @toDate IS NULL) 
2

您可以重写逻辑:

WHERE DC_ITEM.ITEM_CODE=item_master.ITEM_CODE 
AND (@fromDate IS NULL OR @toDate IS NULL 
    OR (DC_MASTER.PSR_LOAD_DATE_TIME >= @fromDate 
     and PSR_LOAD_DATE_TIME <= @toDate) 
    ) 
2

的情况表达式不是必需的。

请注意,要么是参数为空日期范围不起作用,所以我的推测是,如果任一个都是NULL,那么你想要所有的行。

SELECT 
     DC_MASTER.DC_NO 
    , PSR_LOAD_DATE_TIME 
    , CUS_NAME 
FROM DC_ITEM 
     INNER JOIN DC_MASTER ON DC_MASTER.DC_NO = DC_ITEM.DC_NO 
     INNER JOIN ITEM_MASTER ON item_master.ITEM_CODE = DC_ITEM.ITEM_CODE 
     INNER JOIN CUSTOMER_MASTER ON customer_master.CUS_CODE = DC_MASTER.CUS_CODE 
     INNER JOIN LOCATION_MASTER ON location_master.LOC_CODE = DC_ITEM.LOC_CODE 
WHERE (DC_MASTER.PSR_LOAD_DATE_TIME >= @fromDate 
     AND PSR_LOAD_DATE_TIME <= @toDate 
    ) 
     OR (@fromDate IS NULL OR @toDate IS NULL) 

[编辑] 顺便说,对于日期范围最好的做法是使用> =然后<

当你使用> =然后< =你有完全相同的问题之间的原因。