传递给Mysql数据库的语句没有填充DataTable

时间:2015-06-29 19:22:20

标签: mysql vb.net

 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

3 个答案:

答案 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';