如何使用大于运算符比较日期?

146

我不知道这里发生了什么。这是查询语句,直接从phpMyAdmin中获取:

SELECT * FROM `la_schedule` WHERE 'start_date' >'2012-11-18';

但我始终会返回表中的所有记录,包括那些开始日期为2012-11-01的记录。这是怎么回事?


1
你的 start_date 列是 date 类型还是 timestamp 类型? - Shamis Shukoor
7个回答

238

你使用了单引号将start_date包裹起来,导致它变成了字符串,请使用反引号代替。

SELECT * FROM `la_schedule` WHERE `start_date` > '2012-11-18';

4
如果它是时间戳,会发生什么? - KD.S.T.
值得注意的是,MySQL对日期格式似乎有些挑剔;虽然2019/02/08 21:04:07或2019-02-08 21:04:07都能产生预期的结果,但使用美国日期格式的02-08-2019 21:04:07则会涵盖更广泛的范围。 - David A. Gray

26

在你的陈述中,你正在将一个叫做start_date的字符串与时间进行比较。
如果start_date是一列,那么它应该是


SELECT * FROM `la_schedule` WHERE start_date >'2012-11-18';

查询`la_schedule`表中起始日期晚于2012年11月18日的所有数据。该语句为IT技术相关内容。

(没有单引号) 或者


选择所有从“la_schedule”表中起始日期大于'2012-11-18'的数据;

(带有反引号)。

希望这可以帮助你。

12

试试这个。

SELECT * FROM la_schedule WHERE `start_date` > '2012-11-18';

4

因为这是对我实际有效的方法。在比较值上都添加date()函数。

PS: 正如@NikolajHansen在评论中指出的那样,这可能不是理想的解决方案,因为这会在每一行中运行日期函数。


1
你可以通过在la_schedule表的所有行上运行日期函数来开始。然后将其与比较的右侧进行比较 - 如果数据集很大,这可能会给你带来麻烦。 - Nikolaj Hansen
@NikolajHansen。当我再次回想起来时。是的,似乎可能存在优化问题。我同意。我会将这个问题追加到回答中。谢谢。 - dilantha111

4
我已经尝试过,但是在调查后发现以上解决方法不起作用。以下是解决方案。
SELECT * FROM my_table where DATE(start_date) > '2011-01-01';

引用


2
在我的情况下,我的列是一个日期时间类型,它一直给我所有的记录。我所做的就是包括时间,如下面的例子所示。"最初的回答"
SELECT * FROM my_table where start_date > '2011-01-01 01:01:01';

0

如果你正在比较时间戳 - 你可以尝试以下方法

select * from table where columnInTimestamp > ((UNIX_TIMESTAMP() * 1000) - (1*24*60*60*1000))

UNIX_TIMESTAMP()函数提供当前时间戳,而"12460601000"是一天的时间戳 -- 通过这个可以找到在1天或2天内创建的数据等。


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