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

标签 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

最佳答案

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

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

我不知道这一切是否能保证在未来发挥作用。我不会依赖这个。

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

关于mysql - 比较 mysql 中的日期是否需要格式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44715607/

相关文章:

Android/SQLite - WHERE 子句上的位操作

php - 需要有关将图像保存到 mySQL 的指导

php - 创建文本文件并让用户选择下载它 PHP

mysql - DataTables - 过滤一组值中的数据

mysql - 如何获取在 MYSQL 8 中列值更改之前首次出现的选择行

mysql REGEXP匹配以2位数字结尾且仅以非数字开头的字符串

sql - Concat 函数不起作用 - 参数数量无效

使用 XML 提取值的 MYSQL 触发器

MySQL:在每天的订单列表中包含订单为零的日子

sql - 如何在同一表的多行中获取匹配的 WHERE 子句?