按日期时间格式筛选 MYSQL 格式化

22

我有一个用于日志文件的Mysql表格,在该表格中有一个字段名为'log_date',它以以下格式( %Y-%m-%d %H:%i.%s )存储日期。在数据库中,日期看起来像这样2013-20-05 00:00.00。假设今天的日期是2013-20-05,并且我有从2013-01-01到今天的日志文件。如果我运行以下查询:

SELECT * FROM log_table
WHERE STR_TO_DATE(log_date, '%Y-%m-%d %H:%i.%s') < '2013-05-05 00:00.00'

这将返回数据库中所有行,包括大于2013-05-05 00:00.00的行。

如果我将“<”(小于)改为“>”(大于),查询将如下所示:

SELECT * FROM log_table
WHERE STR_TO_DATE(log_date, '%Y-%m-%d %H:%i.%s') > '2013-05-05 00:00.00'

然后它返回零行。我认为时间戳是导致问题的原因,我之前处理过日期格式但没有处理过 DateTime 格式。为什么会发生这种情况?


1
log_date 的数据类型是什么? - Kermit
2个回答

47

log_date 应为 DateTime 数据类型。使用 MySQL DATE 函数要简单得多。以下是一些示例:

SELECT * FROM log_table
WHERE DATE(log_date) < '2013-05-05'

SELECT * FROM log_table
WHERE DATE(log_date) > '2013-05-05'

SELECT * FROM log_table
WHERE DATE(log_date) BETWEEN '2013-04-05' AND '2013-05-05'

SELECT * FROM log_table
WHERE DATE(log_date) BETWEEN DATE(CURRENT_DATE() - INTERVAL 2 WEEK) AND 
DATE(CURRENT_DATE() + INTERVAL 4 DAY)

可能更简单,但不够高效。如果你告诉我原因,我会点赞你。 - Kermit
2
好的,我开始翻译:在WHERE子句中使用内置函数时,无法使用索引。 - blotto
谢谢blotto,我已经尝试只使用DATE函数,但仍然没有效果。我认为这与日期本身的格式有关,即“2013-05-05 00:00.00”,其中包括“%H:%i.%s'”。奇怪的是,小于号将返回所有行,而大于号始终返回零行。过去,当我只使用YYYY-DD-MM时,它可以完美排序,但此格式包括时间。 - Ryan Bauer
1
谢谢大家,问题出在语法上,我在日期的最后一部分插入了一个句号2out the b013-20-05 00:00 . 0(没有空格),而数据库使用的格式是在最后一位上加了一个点。最终代码如下:SELECT * FROM WHERE DATE_FORMAT(log_date , '%Y-%d-%m %H:%i:%s') > '2013-18-05 00:00:00' - Ryan Bauer

1
你可以试一下这个..
WHERE DATE_FORMAT(AUCTION_DATE, '%Y%m%d') >= DATE_FORMAT('2013/5/18', '%Y%m%d')

您也可以使用 now() 函数获取今天的日期。

2
你不应该这样做:DATE_FORMAT() 函数会为每一行计算一次,而不是针对一个常量进行测试,例如 DATE_FORMAT('2013/5/18', '%Y%m%d')。所以最好这样做:WHERE AUCTION_DATE >= DATE_FORMAT('2013/5/18', '%Y%m%d'),这样可以使用索引。 - Yvan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接