2017-06-23 51 views
0
SELECT * FROM table WHERE '2016-03-31' > (SELECT MAX(year) from table where bill_id = 'somevalue') 

我使用上面的查询,检查2016年3月31日比出现在对bill_id表中的所有岁以上在MySQL中比较日期。它工作正常。但它是比较日期的正确方法。日期将始终以上述格式。有没有需要转换日期格式作比较。值2016年3月31日会动态变化,但它会始终YMD格式是格式化需要

注:今年是包含了像2016年5月20日

+0

据我所知,今年和今年的比较会更好,更快。这样,MySQL在对输入进行比较之前不需要对输入做任何事情,只需将它与'MAX(年)' – FMashiro

+0

年份列的输出进行比较就可以得到Ymd格式的全部值 – hrishi

+1

我不确定是否问您是否必须转换日期字符串进行比较(你不应该)或如果日期文字是可配置的(不是)。但是在这里你不是在做日期数学,因为MySQL只是一些字符串。 –

回答

0

你是不是在比较YMD格式的全日期列名日期。您正在比较字符串'2016-03-31'与数字,例如2015

为了比较,MySQL默默地将字符串转换为数字。人们会认为这会崩溃,因为'2016-03-31'当然不是一个数字。然而,MySQL从左向右读取所有可以被认为是数字的数据,即'2016'。那么,有人可能会争辩说,有些人在数字的末尾加上了一个减号,所以这应该是'2016-',即-2016。无论如何,MySQL在减号之前停止,得到2016并将其用于比较。

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

你会期望什么结果呢? 2016年3月31日比2016年多吗?这是一个奇怪的问题,你不觉得吗?

+0

列年包含Y-m-d格式的完整日期,如2016-03-31。所以你可以说2016-03-31与数据库中的日期相似2015-05-30,2014-03-31 – hrishi

+0

好的,所以我误解了你的问题。你从我的解释中看到,选择了一个非常糟糕的列名,这使得你的查询几乎不可读。所以'year'不包含一年,而是一个日期字符串。由于该字符串始终包含yyyy-mm-dd,并且您将它与具有相同格式的字符串进行比较,所以可以毫无问题地完成此操作。除了命名日期字符串'year'外,使用字符串类型而不是日期类型也很奇怪。这使得错误地存储'2015-055-30'等成为可能。但是,只要'year'确实包含有效的yyyy-mm-dd日期,那么您的查询就没有问题。 –

+0

好的。我会照顾列名和数据类型 – hrishi

0

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

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

列年包含Y-m-d格式的完整日期,如2016-03-31 – hrishi

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

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