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

时间:2012-01-01 17:46:28

标签: sql-server datetime

在表格中,我有一个名为BillDate (Datetime)的列。日期时间以YYYY-MM-DD格式存储(例如:2012-01-01 00:00:00.000)。现在我想检索日期时间值范围之间的值。当我使用查询时,我无法得到结果:

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'

7 个答案:

答案 0 :(得分: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 :(得分:1)

你需要使用121格式的代码,如下所示:

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

但是如果它以DATETIME类型存储,则不需要使用CONVERT,并且优化器可以在这种情况下使用索引:

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

尽量保持简单

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

标题和问题针对不同的概念。标题提到“存储过程”,问题和答案直接从表中选择。