1

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

无论如何,日期在列中的形式为

“2014 年 8 月 14 日上午 1:01”(或下午)

我真的只是想根据字符串的日期部分获取一个 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 - 我只是尝试逐步构建一个查询字符串以查看我做对了,然后再尝试进入下一个级别)

我也尝试通过以下方式格式化时间:

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 选择。

我哪里错了?

4

2 回答 2

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运算符。例如:

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

于 2014-09-29T16:29:51.300 回答
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

你会看到你的“坏”数据。

于 2014-09-29T16:01:25.973 回答