如何将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'
答
试试这个:
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)
如果您不使用表列和参数上的转换,会发生什么情况? – Ric 2012-01-01 17:51:08
“日期时间存储格式为YYYY-MM-DD” - 不,它不是。无论内部表示如何,它都存储为“DateTime”。不要将格式与存储混淆。 – Oded 2012-01-01 17:51:14
为什么你传递字符串参数而不是'DateTime'? – Oded 2012-01-01 17:53:41