在表格中,我有一个名为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'
答案 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)
标题和问题针对不同的概念。标题提到“存储过程”,问题和答案直接从表中选择。