2012-01-01 110 views
1

在表中,我有一個名爲BillDate (Datetime)的列。日期時間以格式YYYY-MM-DD(例如:2012-01-01 00:00:00.000)存儲。現在我想檢索日期時間值範圍內的值。當我使用的查詢,如下我無法得到的結果是:如何將Datetime值作爲參數傳遞給存儲過程?

SELECT * FROM RequestHeader 
WHERE 
    CONVERT(VARCHAR, RH.BillDate ,105) BETWEEN CONVERT(VARCHAR, @FromDate,105) 
    AND CONVERT(VARCHAR,@ToDate , 105) 

@FromDate is passed as : '2012-01-01' 
@ToDate is passed as : '2012-01-01' 
+0

如果您不使用表列和參數上的轉換,會發生什麼情況? – Ric 2012-01-01 17:51:08

+5

「日期時間存儲格式爲YYYY-MM-DD」 - 不,它不是。無論內部表示如何,它都存儲爲「DateTime」。不要將格式與存儲混淆。 – Oded 2012-01-01 17:51:14

+0

爲什麼你傳遞字符串參數而不是'DateTime'? – Oded 2012-01-01 17:53:41

回答

1

試試這個:

SELECT * FROM RequestHeader 
WHERE 
    CONVERT(VARCHAR, RH.BillDate ,105) BETWEEN CONVERT(VARCHAR, CAST(@FromDate AS DATETIME),105) 
    AND CONVERT(VARCHAR, CAST(@ToDate AS DATETIME), 105) 

不幸的是,使用這種方法不使用索引,因此,如果如果您的日期列被編入索引,您希望能夠快速執行查詢,您不會在這裏感受到它。

1

你需要使用的105 121格式的代碼這一翻譯,像這樣:

SELECT * FROM RequestHeader 
WHERE 
    CONVERT(VARCHAR, RH.BillDate ,121) BETWEEN CONVERT(VARCHAR, @FromDate,121) 
    AND CONVERT(VARCHAR,@ToDate , 121) 

如果存儲爲DATETIME類型,你不必使用CONVERT,並優化可以在此使用索引case:

SELECT * FROM RequestHeader 
WHERE 
    RH.BillDate BETWEEN @FromDate AND @ToDate 
1

解決此問題的最佳方法是將datetime值作爲日期時間值傳遞,而不是字符串。這在SQL服務器和存儲過程源代碼的讀取器上都會更容易。

1

在您的示例中@FromDate與@ToDate相同。兩個等值之間沒有值。我會假設你有這些值只是一個例子,所以我會盡力回答。

首先,我沒有看到需要將BillDate轉換爲VARCHAR。如果傳遞的參數也是日期,那麼沒有理由將其轉換。如果沒有,它可以被轉換。

我創建了一個簡單的測試,以確認我的假設:

DECLARE @FromDate VARCHAR(50) 
DECLARE @ToDate VARCHAR(50) 

SET @FromDate = '2012-01-01' 
SET @ToDate = '2012-01-05' 


INSERT INTO RequestHeader (BillDate) VALUES('12/1/2011') 
INSERT INTO RequestHeader (BillDate) VALUES('1/3/2012') 
INSERT INTO RequestHeader (BillDate) VALUES('1/4/2012') 
INSERT INTO RequestHeader (BillDate) VALUES('1/5/2012') 

SELECT * FROM RequestHeader 
WHERE 
    BillDate BETWEEN CAST(@FromDate AS DateTime) AND CAST(@ToDate AS DateTime) 

結果:

BillDate 
2012-01-03 00:00:00.000 
2012-01-04 00:00:00.000 
2012-01-05 00:00:00.000 

(3 row(s) affected) 
0

保持它儘可能簡單

SELECT * FROM RequestHeader 
WHERE 
    BillDate BETWEEN @FromDate AND @ToDate 

@FromDate和@ToDate是,當然,日期時間變量,而不是varchars。

0
SELECT * FROM RequestHeader 
WHERE BillDate 
BETWEEN convert(Datetime,@FromDate,102) 
AND convert(Datetime,@ToDate,102) 
相關問題