有关Mysql中不同格式化日期字符串的比较问题

问题如下,首先一个sql如:

clipboard.png

图1
在它select中一个date型字段出现在where条件中,两处对其格式化的样式不同(如图1),执行可以正常返回结果(如图2)

clipboard.png
图2
但是颠倒格式化的写法(如图3),就是“-”的变成“/”,执行就没有结果了,想请教下大家,在mysql中,日期格式化它究竟是如何进行判断的呢?

clipboard.png
图3
另外我也试过,select中字段不格式化也能正常查到数据

阅读 4.4k
1 个回答

1.我感觉你是把数据结果搞混了吧?图1的SQL怎么会得到图2的输出,你都把test表的时间列格式化成以"-"为分割符,怎么输出会是"/"为分隔符?
2.像这种date_format()之后再比较时间的大小,其实是把时间当成字符串来比较,例如

mysql> select date_format('2019-12-12 23:54:12','%y-%m-%d');
+-----------------------------------------------+
| date_format('2019-12-12 23:54:12','%y-%m-%d') |
+-----------------------------------------------+
| 19-12-12                                      |
+-----------------------------------------------+
1 row in set (0.00 sec)

mysql> select date_format('2019-06-27','%y/%m/%d %h%i%s');
+---------------------------------------------+
| date_format('2019-06-27','%y/%m/%d %h%i%s') |
+---------------------------------------------+
| 19/06/27 120000                             |
+---------------------------------------------+
1 row in set (0.00 sec)

mysql> select date_format('2019-12-12 23:54:12','%y-%m-%d') > date_format('2019-06-27','%y/%m/%d %h%i%s');  
+---------------------------------------------------------------------------------------------+
| date_format('2019-12-12 23:54:12','%y-%m-%d') > date_format('2019-06-27','%y/%m/%d %h%i%s') |
+---------------------------------------------------------------------------------------------+
|                                                                                           0 |
+---------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

这里之所以'2019-12-12 23:54:12'>'2019-06-27'不成立,是因为通过date_format转换后,作比较的其实是两个字符串'19-12-12'和'19/06/27 120000',开头的"19"两者相等,但到了"-"和"/"比较,根据ascii可以知道,"/">"-",所以通过date_format转换之后,会出现'2019-12-12 23:54:12'<'2019-06-27'的假象。
这里也得出,要比较时间,就要把格式转换成一致,这本来就不是什么难事,为什么搞得那么乱呢?
3.不格式化也能查到数据,是MySQL能识别到你在对比时间。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题