2013-10-31 82 views
1
SET @dateFrom = '' 
SET @dateTo = '' 

SELECT [tNumber], [createdDate], [Total], [pfAmount] FROM [webtable] 
WHERE [tNumber] LIKE '%' 
AND [createdDate] > @dateFrom+'%' 
AND [createdDate] < @dateTo+'%' 

我試圖得到查詢從數據庫中顯示所有值,如果日期是空白的,或者@dateFrom和@dateTo具有價值,那麼它應該過濾那些具體結果顯示所有記錄,如果日期是在SQL查詢空

+0

是日期字符串?否則,您會迫使日期進行字符串轉換,這可能會產生意想不到的結果。 –

+0

@PanagiotisKanavos是的日期是字符串格式 – neeko

+0

你應該比較日期而不是字符串。您需要在比較之前將這些字符串轉換爲有效日期。 – Kaf

回答

1
SELECT [tNumber], [createdDate], [Total], [pfAmount] FROM [webtable] 
WHERE [tNumber] LIKE '%' 
AND (
     (  [createdDate] > @dateFrom --removed +'%' 
      AND [createdDate] < @dateTo) --close 2nd parentheses and removed +'%' 
     OR  COALESCE(@dateFrom,@dateTo) IS NULL 
    ) --close 1st parantheses 

COALESCE()評估後,它的另一個括號內的一兩件事,直到它沒有找到一個NULL值。如果所有值都爲NULL,則返回NULL。隨着我寫這篇聲明的方式,如果兩個參數都爲NULL,沒有什麼是[createdDate]

UPDATE過濾

去除+'%'

+0

可選地,您可以「硬化」參數值:'[createdDate]> ISNULL(@ dateFrom,'1/1900分之1' )'。如果未填充,這將強制@dateFrom包含所有可能的值。 –

+0

感謝您的回答,我不能讓它工作,這是因爲我已經聲明參數是varchar? – neeko

+0

我沒有刪除'@ dateFrom'和'@ dateTo'後面的'+'%'。那不屬於那裏。爲什麼又在那裏? –

1

試試這個

SET @dateFrom = '' 
    SET @dateTo = '' 

    SELECT [tNumber], [createdDate], [Total], [pfAmount] FROM [webtable] 
    WHERE [tNumber] LIKE '%' 
    AND CASE 
      WHEN (@dateFrom = '' OR @dateTo = '') THEN ([createdDate] LIKE '%') 
     ELSE ([createdDate] BETWEEN @dateFrom and @dateTo) 
     END 
+0

感謝您的解決方案!它仍然顯示沒有結果,當參數是空的,任何想法? – neeko

+0

@neeko請試試這個查詢..我已編輯答案... – user2919277

+0

@neeko這一定會工作..祝你好運 – user2919277

0
declare @fdate datetime 
declare @tdate datetime 
set @fdate=''--'2013-10-10' 
set @tdate=''--'2013-10-10' 
select * from yourTable where (datefield>@fdate or @fdate='') and (datefield<@tdate or @tdate='') 

試試這個..

1

試試這個:

SET @dateFrom = '' 
SET @dateTo = '' 
IF(@dateFrom = '' AND @dateTo='') 
BEGIN 
SELECT [tNumber], [createdDate], [Total], [pfAmount] FROM [webtable] 
END 
ELSE 
BEGIN 
SELECT [tNumber], [createdDate], [Total], [pfAmount] FROM [webtable] 
WHERE [tNumber] LIKE '%' 
AND [createdDate] > convert(DATE,@dateFrom) 
AND [createdDate] < COnvert(Date,@dateTo) 
END 
0
SELECT [tNumber], [createdDate], [Total], [pfAmount] FROM [webtable] 
WHERE [tNumber] LIKE '%' 
AND (@dateFrom = '' OR [createdDate] > @dateFrom+'%') 
AND (@dateTo = '' OR [createdDate] < @dateTo+'%') 
+1

我沒有看到'[tNumber] LIKE'%''的目的,除非你想強制一個表掃描...它返回的結果太快? – dav1dsm1th

+0

[tNumber]不爲空可能更有效 – Paparazzi

+0

@ dav1dsm1th我忘記了包括tbnumber搜索段在查詢中,例如[tNumber] LIKE'@searchTNumber +'%'',可以讓它返回所有記錄,如果爲空 – neeko

0

要顯示記錄的日期是空的,你可以用下面這樣的查詢

select * from [webtable] where ID not in (Select ID from [webtable] where [createdDate] > COnvert(Date, ''))