是否需要格式化以比较mysql中的日期

时间:2017-06-23 07:32:37

标签: mysql sql

SELECT * FROM table WHERE '2016-03-31' > (SELECT MAX(year) from table where bill_id = 'somevalue')

我使用上面的查询来检查2016-03-31是否大于表格中针对bill_id的所有年份。它工作正常。但这是比较日期的正确方法。日期将始终采用上述格式。是否需要转换日期格式进行比较。值2016-03-31将动态变化,但它将始终为Y-m-d格式

注意:年份是列名,其中包含Y-m-d格式的完整日期,如2016-05-20

3 个答案:

答案 0 :(得分:0)

您没有比较日期。您正在将字符串'2016-03-31'与数字进行比较,例如2015

为了进行比较,MySQL默默地将字符串转换为数字。人们会期望这会崩溃,因为'2016-03-31'肯定不是一个数字。然而,MySQL从左到右读取并从中获取所有可被视为数字的数字,即'2016'。好吧,有人可能会说某些人在数字末尾加上一个减号,所以这应该是'2016-',即-2016。无论如何,MySQL在减号之前停止,得到2016并将其用于比较。

我不知道这一切是否能保证将来有效。我不会依赖这个。

无论如何,你会期待什么结果? 2016年3月31日是否大于2016年?这是一个奇怪的问题,你不觉得吗?

答案 1 :(得分:0)

试试这个。但是你真的有一个只存储一年的专栏year吗?

    SELECT * FROM table WHERE year(STR_TO_DATE('2016-03-31')) 
> (SELECT MAX(year) from table where bill_id = 'somevalue')

答案 2 :(得分:0)

SELECT * FROM table WHERE YEAR('2016-03-31') > (SELECT MAX(year) from table where bill_id = 'somevalue')

MySQL YEAR()返回给定日期或时间戳的年份。对于“零”日期,返回值的范围为1000到9999或0。