-2

我的问题可能与SELECT.

在一个 asp 文件中,我打开一个 ADO 记录集,想要检索介于date1 (08/15/2013)和之间的 MS SQL 表行date2 (08/22/2013)(即,从今天开始的前 7 天。)

确实检索了适当的SELECT2013 行,但也检索了可追溯到 2012 年 8 月 15 日的行。

这是选择:

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

4

2 回答 2

3

停止在 VARCHAR 列中存储日期!并停止连接字符串,使用正确的参数。

很抱歉大喊大叫,但我们每天都会收到多个问题,人们出于某种未知且可能很愚蠢的原因使用了错误的数据类型,这就是它导致的问题。

这里的问题是您正在比较strings。尝试:

"... 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 & "'"

请注意,我使用开放式范围(>= 和 <)而不是 BETWEEN,以防万一有些时间滑入您的 VARCHAR 列。

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

于 2013-08-22T15:31:26.870 回答
0

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

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

Sql Fiddle 链接

于 2013-08-22T15:36:06.527 回答