我的问题可能与SELECT
中的日期格式有关。
在一个asp文件中,我打开一个ADO Recordset,想要检索介于date1 (08/15/2013)
和date2 (08/22/2013)
之间的MS SQL表的行(即从今天起的前7天)。
SELECT
会检索相应的2013行,但也会检索返回到2012年8月15日的行。
这是SELECT:
oRS.Source = "SELECT * FROM aTable WHERE entry_Date BETWEEN '" & resultLowerDate & "' AND '" & resultCurrentDate & "' AND entry_Status <> 'INACTIVE'"
resultLowerDate = 08/15/2013和resultCurrentDate = 08/22/2013。
表格设置如下,resultCurrentDate =“08/22/2013”:
entry_Status entry_Date (varchar) LastName FirstName SELECT Result
INITIAL 08/15/2012 Smith Jim YES
INACTIVE 08/21/2012 Green Tom no
INITIAL 08/22/2013 Jones Mary yes
FOLLOWUP 08/22/2013 Jones Mary yes
FOLLOWUP 08/22/2013 Brown Sally yes
FOLLOWUP 08/22/2013 Smith Jim yes
有关为什么选择INITIAL 08/15/2012
行以及符合SELECT
查询的其他行的任何想法?
答案 0 :(得分:3)
停止在VARCHAR COLUMNS中存储日期!并停止连接字符串,使用合适的参数。
很抱歉大喊大叫,但是我们每天都会收到多个问题,人们会使用错误的数据类型来解决某些未知且可能很愚蠢的问题,这些都是导致问题的原因。
这里的问题是您要比较 字符串 。尝试:
"... WHERE CONVERT(DATETIME, entry_date, 101)" & _
" >= CONVERT(DATETIME, '" & resultLowerDate & "', 101)" & _
" AND CONVERT(DATETIME, entry_date, 101)" & _
" < DATEADD(DAY, 1, CONVERT(DATETIME, '" & resultCurrentDate & "', 101))"
或者更好的是,将resultLowerDate和resultUpperDate设置为YYYYMMDD格式,然后你可以说:
"... WHERE CONVERT(DATETIME, entry_date, 101) >= '" & resultLowerDate & "'" & _
" AND CONVERT(DATETIME, entry_date, 101) < DATEADD(DAY, 1, '" & resultCurrentDate & "'"
请注意,我使用开放式范围(&gt; =和&lt;)而不是BETWEEN,以防万一有时间滑入您的VARCHAR列。
另请注意,此查询可能会失败,因为垃圾进入您的列。它可以,因为您选择了错误的数据类型。我的真正建议是修复表并使用DATE
或DATETIME
列。
答案 1 :(得分:0)
您的entry_Date列是varchar字段而不是实际日期的事实是问题所在。如果您在选择期间将其投射到日期时间,您将获得预期的结果。
select *
from aTable
where cast(entry_Date as datetime) between '08/15/2013' and '08/22/2013'