SQL“BETWEEN”请求不按我的意思行事

时间:2016-06-13 09:21:16

标签: mysql sql between

我的SQL请求存在一些问题。

这是请求:

SELECT SUBSTR(`Date`, 1, 11) AS `format_date` 
FROM table 
HAVING `format_date` BETWEEN '07/06/2016' AND '16/06/2016'

当我运行请求时,我不希望得到像“07/11/2014”这样的结果。在做了一些测试后,看起来请求只考虑了一天,但我无法弄清楚原因。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

import groovy.sql.Sql import com.microsoft.sqlserver.jdbc.SQLServerDataSource def host = 'myhost' def port = '1433' def database = 'mydatabasename' def usernameName = 'myusername' def password = 'mypassword' def dataSource = new SQLServerDataSource() dataSource.setURL("jdbc:sqlserver://$host:$port") dataSource.setUser(username) dataSource.setPassword(password) def connection new Sql(dataSource) connection.execute( 'IF EXISTS (SELECT * FROM master.dbo.sysdatabases WHERE name = ?) DROP DATABASE ?', [ databaseName, databaseName ] ) 介于两个给定的字符串之间。您正在比较字符串,而不是日期,但您得到的正是您所要求的。

这是你比较的:

  

“07/0”< “07/1”< “16/0”

尝试比较实际日期,或格式化字符串以便您可以使用它们(YYYY / MM / DD)。

此问题(及其接受的答案)应该可以帮助您将字符串转换为可用日期: how-to-convert-a-string-to-date-in-mysql

然后,您可以相互制作实际日期。

答案 1 :(得分:1)

你得到错误结果的原因已经很清楚了,你可以试试以下;)

SELECT SUBSTR(`Date`, 1, 11) AS `format_date` 
FROM table 
HAVING STR_TO_DATE(`format_date`, '%d/%m/%Y') BETWEEN STR_TO_DATE('07/06/2016', '%d/%m/%Y') AND STR_TO_DATE('16/06/2016', '%d/%m/%Y')

我认为您应该将HAVING更改为WHERE

答案 2 :(得分:0)

您的问题可以在以下表达式中总结出来......

SELECT '8' BETWEEN '7' AND '77';
+--------------------------+
| '8' BETWEEN '7' AND '77' |
+--------------------------+
|                        0 |
+--------------------------+

答案 3 :(得分:0)

要解决3个问题。

  1. 最简单的是你错误地使用了HAVING而不是WHERE。

  2. 您已将日期转换为dd / mm / yyyy形式的字符串。这里的问题是文本(字符串)的行为不像数字,例如文本1和10中的文本在2或3之前排序。因此,您要求在类似于日期的字符串之间使用TEXT,但它不会表现为因为它需要将日期作为数字处理。

  3. 介于处理日期范围之间是一种非常糟糕的方法。更可靠的方法是使用> =和<的组合。如下所示。

  4. 实施例

    SELECT SUBSTR(Date, 1, 11) AS `format_date` 
    FROM table 
    WHERE `date` >= '2016-06-06'' AND `date` < '2016-06-17'