如何将Datetime值作为参数传递给存储过程?

问题描述:

在表中,我有一个名为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

试试这个:

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) 

不幸的是,使用这种方法不使用索引,因此,如果如果您的日期列被编入索引,您希望能够快速执行查询,您不会在这里感受到它。

你需要使用的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 

解决此问题的最佳方法是将datetime值作为日期时间值传递,而不是字符串。这在SQL服务器和存储过程源代码的读取器上都会更容易。

在您的示例中@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) 

保持它尽可能简单

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

@FromDate和@ToDate是,当然,日期时间变量,而不是varchars。

SELECT * FROM RequestHeader 
WHERE BillDate 
BETWEEN convert(Datetime,@FromDate,102) 
AND convert(Datetime,@ToDate,102)