在日期之间选择几乎工作

时间:2013-08-22 15:21:44

标签: sql-server-2008 date select

我的问题可能与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查询的其他行的任何想法?

2 个答案:

答案 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列。

另请注意,此查询可能会失败,因为垃圾进入您的列。它可以,因为您选择了错误的数据类型。我的真正建议是修复表并使用DATEDATETIME列。

答案 1 :(得分:0)

您的entry_Date列是varchar字段而不是实际日期的事实是问题所在。如果您在选择期间将其投射到日期时间,您将获得预期的结果。

select *
from aTable
where cast(entry_Date as datetime) between '08/15/2013' and '08/22/2013'

Sql Fiddle link