dbQuery = "SELECT * FROM table WHERE date BETWEEN " & startDate & " AND " & endDate & ""
当我在NaviCat中执行此语句时,它也不返回任何值。这些价值确实存在于2015年6月19日和22日。 我发错的信息???
调试后,查询发送如下。
select * from table where date between 6/1/2015 and 6/31/2015
答案 0 :(得分:3)
由于您的列是varchar
,如果您希望比较正常工作,则需要将其强制转换为正确的类型。
dbQuery = "SELECT * FROM table WHERE date BETWEEN CAST('" & startDate & "' as DATE) AND CAST('" & endDate & "' as DATE)"
或者,由于您使用的是MySQL,因此您可以使用STR_TO_DATE
函数,如下所示:
dbQuery = "SELECT * FROM table WHERE date BETWEEN STR_TO_DATE('" & startDate & "', '%m/%d/%Y') AND STR_TO_DATE('" & endDate & "', '%m/%d/%Y')"
这两者之间的主要区别在于,尝试将CAST
无效字符串添加到日期中会导致错误,而使用STR_TO_DATE
执行相同操作会将NULL
替换为$ awk 'BEGIN{srand()} {for (i=1;i<=NF;i++) {if (substr($i,1,1)=="{") {split(substr($i,2,length($i)-2),a,"|"); j=1+int(rand()*length(a)); $i=a[j]}}; print}' math.txt
First: 172 + 1
Second: John had 12 apples and lost 3
无效的字符串,这将导致您的查询不返回任何行。
正如其他人所提到的那样,通过将日期存储为字符串,你不会给自己带来任何好处。在大多数语言中,将日期转换为字符串(即出于显示目的)非常容易,但反之并非总是如此。由于您将日期存储为字符串,因此您可以做的最好的事情是投射并希望所有字符串都是有效日期。
SQL标准包含日期的数据类型,并且有充分的理由。建议您使用它们。
答案 1 :(得分:1)
要使比较按照您期望的方式对“日期”值进行操作,您需要将字符串转换为DATE
值。
您的查询中的问题是比较是在数字上下文中完成的,而不是在DATE
值上。您的查询大致相当于
SELECT *
FROM table
WHERE date BETWEEN 0.0029776674937965260545905707 AND 0.000096053790122469
也就是说,“之间”比较中的文字正在评估数值(例如,六除以三十一除以二千五十五)。为了说明这一点,请考虑以下输出:
SELECT '6/12/2015'
, 6/1/2015
, 6/31/2015
, '6/12/2015' BETWEEN 6/1/2015 AND 6/31/2015
, '6/12/2015' BETWEEN 5.9 AND 6.2
如果您将文字包装在引号中(如另一个答案所示),不也会给出预期的行为。
SELECT *
FROM table
WHERE date BETWEEN '6/1/2015' AND '6/31/2015'
数字评估和比较的问题已修复,但现在比较将在 string 上下文中完成。这将在6月份返回一些日期值,但它也会排除某些我们(合理地)期望返回的值,例如 2015' 年6月4日即可。作为演示,请考虑:
SELECT '6/4/2015' BETWEEN '6/1/2015' AND '6/31/2015'
MySQL具有内置数据类型,用于处理“日期时间”类型值... DATE
, DATETIME
和 {{1 }} 即可。这些数据类型使得“日期”和“日期时间”值的使用变得简单,并使比较变得简单。
使用DATE数据类型和STR_TO_DATE函数
要将比较作为“日期”值进行,请将列值和文字转换为 TIMESTAMP
数据类型。
MySQL DATE
函数会根据指定的格式将字符串转换为STR_TO_DATE
。
要使“日期”比较在字符串值上“正确”工作,您可以执行以下操作:
DATE
请注意文字周围的单引号,将这些文字视为字符串,而不是数字表达式。真正的诀窍是MySQL SELECT t.*
FROM table t
WHERE STR_TO_DATE( t.date ,'%m/%d/%Y')
BETWEEN STR_TO_DATE( '6/1/2015' ,'%m/%d/%Y')
AND STR_TO_DATE( '6/3/2015' ,'%m/%d/%Y')
函数。
请注意,MySQL无法有效地使用索引来满足谓词,必须为表中的每个行评估STR_TO_DATE
函数。
如果此列被定义为STR_TO_DATE
数据类型,那么我们可以在裸列上进行比较,MySQL可以在合适的索引上使用范围扫描操作。
答案 2 :(得分:-1)
正如史蒂夫所说,田野类型对约会不利。无论如何,由于日期类型是varchar,你可以试试这个:
select * from table where date >= '6/1/2015' and date <= '6/31/2015';