我的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”这样的结果。在做了一些测试后,看起来请求只考虑了一天,但我无法弄清楚原因。有什么想法吗?
答案 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个问题。
最简单的是你错误地使用了HAVING而不是WHERE。
您已将日期转换为dd / mm / yyyy形式的字符串。这里的问题是文本(字符串)的行为不像数字,例如文本1和10中的文本在2或3之前排序。因此,您要求在类似于日期的字符串之间使用TEXT,但它不会表现为因为它需要将日期作为数字处理。
介于处理日期范围之间是一种非常糟糕的方法。更可靠的方法是使用> =和<的组合。如下所示。
实施例
SELECT SUBSTR(Date, 1, 11) AS `format_date`
FROM table
WHERE `date` >= '2016-06-06'' AND `date` < '2016-06-17'