具有VARCHAR日期的SQL Where子句

时间:2016-12-30 16:37:50

标签: mysql datetime

我有一个MySQL数据库可以使用LASTUPDATE列作为VARCHAR。 此字段的格式为:YYYY-MM-DD HH:mm:ss

我需要设置一个SELECT查询来查找某个日期之后的所有行,所以我试图以这种方式使用CONVERT函数

SELECT * from POWER WHERE CONVERT(DATETIME, LASTUPDATE) > 'CONVERT(DATETIME, '2016-12-29 17:24:22')'

但是我收到了错误

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LASTUPDATE) > 'CONVERT(DATETIME, '2016-12-29 17:32:52')'' at line 1

我也尝试过使用:

SELECT * from POWER WHERE CONVERT(DATETIME, LASTUPDATE) > '2016-12-29 17:32:52'但是我得到了同样的错误

3 个答案:

答案 0 :(得分:3)

您可以使用str_to_date

SELECT * 
from POWER 
WHERE str_to_date(LASTUPDATE, '%Y-%m-%d %H:%i:%s' ) > 
        str_to_date('2016-12-29 17:24:22', '%Y-%m-%d %H:%i:%s' )

答案 1 :(得分:1)

使用str_to_date()

查询应该像这样使用str_to_date()。有关详细信息,请参阅MySQL Manual

SELECT 
    * 
from POWER 
WHERE 
    str_to_date(LASTUPDATE, '%Y-%m-%d %H:%i:%s') > '2016-12-29 17:24:22'

日期和时间

请注意,MySQL接受日期和时间文字,因此str_to_date运算符的右侧不需要另一个>。有关详细信息,请参阅this

关于存储日期值

的字符串字段的表单between ... and ...

有人建议使用between ... and ...的形式,例如一个 如下所示。请注意,只有字符串时,此方法才能 值恰好使用一种格式,在该格式中,按字母顺序(在给定的排序规则中)对字符串进行排序,以提供与日期相同的排序顺序(原始问题中使用的格式 - '%Y-%m-%d %H:%i:%s' - 恰好满足此条件,但对于日期/时间值的许多字符串表示,这并不能保证(参见下面的示例)。

SELECT 
    * 
from POWER 
WHERE 
    LASTUPDATE between '2016-12-29 17:24:22' AND '2016-12-31 23:59:59';

如果字符串值使用不同的格式,则会失败,例如:

create table power (
  lastupdate varchar(40) not null default ''
) engine=innoDB;

insert into power
values
('Dec 30, 2016 07:24:22')
, ('Jan 28, 2016 07:24:22')

对于上述内容,我们仍然必须使用str_to_date()函数(这次使用的format参数%b %d, %Y %H:%i:%s与字符串值使用的格式相匹配)

SELECT 
    * 
from POWER 
WHERE 
    str_to_date(LASTUPDATE, '%b %d, %Y %H:%i:%s') > '2016-12-29 17:24:22';

我有一个显示上述示例的sqlfiddle.com页面。

答案 2 :(得分:0)

convert是MS-SQL Server函数。在MySQL中,您可以使用具有类似语义的str_to_date函数:

SELECT * 
FROM   power
WHERE  STR_TO_DATE(lastupdate, '%Y-%m-%d %H-%i-%s') > 
       STR_TO_DATE('2016-12-29 17:24:22', '%Y-%m-%d %H-%i-%s')