获取SELECT语句以使用STR_TO_DATE

时间:2014-09-29 15:49:01

标签: mysql select str-to-date

我将日期存储为表格中的字符串(列名称为' log_event') - 是的,我知道它应该是真实的日期类型 - 但我正在使用现有的表格我没有创造等等。

无论如何,日期在列中以

的形式出现

' 08/14/2014 1:01 am' (或下午)

我真的只是想根据字符串的日期部分来获取SELECT(我不关心我的SELECT的时间,我只需要所有有日期的行在说date1和date2之间,我试过了:

SELECT * FROM db_event_log WHERE STR_TO_DATE(log_event,'%m/%d/%Y') > STR_TO_DATE('08/01/2014', '%m/%d/%Y')

但我的SELECT返回NULL

(是的,我知道这并不是在两个日期之间进行选择 - 我只是尝试逐步构建一个查询字符串,以确保我在尝试之前做到了进入下一个级别)

我还试图通过以下方式进行格式化:

SELECT * FROM db_event_log WHERE STR_TO_DATE(log_event,'%m/%d/%Y %l:%i %p') > STR_TO_DATE('08/01/2014 12:00 am', '%m/%d/%Y %l:%i %p')

也返回NULL选择。

我哪里错了?

2 个答案:

答案 0 :(得分:0)

试试这个:

 DATE(STR_TO_DATE(log_event,  '%m/%d/%Y %l:%i %p'))

STR_TO_DATE()在无法理解其整个输入字符串时返回NULL,因此我建议您解释整个事物,然后使用DATE()来获取日期部分。

您还可以在不从每个文本时间戳中获取日期部分的情况下进行日期范围选择。这将获得昨天的条目,例如

 WHERE STR_TO_DATE(log_event,  '%m/%d/%Y %l:%i %p') >= DATE(NOW()) - INTERVAL 1 DAY
   AND STR_TO_DATE(log_event,  '%m/%d/%Y %l:%i %p') <  DATE(NOW())

顺便说一下,当您清理数据时,坚持返回NULL会很有帮助。在进行故障排除时,您可以提供这样的命令来查找不合理的日期字符串。

 SELECT whatever FROM table WHERE STR_TO_DATE(log_event,  '%m/%d/%Y %l:%i %p') IS NULL

你会看到你的&#34;坏&#34;数据

答案 1 :(得分:0)

您的代码适合我......

我在sqlfiddle.com上设置了以下架构:

CREATE TABLE db_event_log (
    id INT(11) NOT NULL AUTO_INCREMENT,
    log_event VARCHAR(30) NOT NULL,
    PRIMARY KEY (id)
);

INSERT INTO db_event_log (log_event) 
VALUES ('07/14/2014 1:01 am'),
       ('08/14/2014 1:01 am'),
       ('09/14/2014 9:01 pm');  

...然后运行您的查询:

SELECT * FROM db_event_log 
WHERE STR_TO_DATE(log_event,'%m/%d/%Y') > STR_TO_DATE('08/01/2014', '%m/%d/%Y')

...返回:

ID  LOG_EVENT
2   08/14/2014 1:01 am
3   09/14/2014 9:01 pm

http://sqlfiddle.com/#!2/59da0/1

获取结果介于两个日期

要在两个日期之间获得结果,您可以使用MySQL的BETWEEN运算符。 EG:

SELECT * FROM db_event_log 
WHERE STR_TO_DATE(log_event,'%m/%d/%Y') 
BETWEEN STR_TO_DATE('08/01/2014', '%m/%d/%Y') AND STR_TO_DATE('09/01/2014', '%m/%d/%Y')

http://sqlfiddle.com/#!2/cc7681/1