按 MySql 上的日期对字符串进行排序

Sort on string as date on MySql

我将 CHAR 字符串以 mm/dd/yyyy 格式存储在数据库字段中。比如

2/26/2022
2/19/2022
2/12/2022
2/5/2022
12/31/2021
12/18/2021
11/27/2021

我需要在不更改声明的情况下按照“日期”对它们进行排序。

MySQL date format DD/MM/YYYY select query? 的 post 建议使用 ORDER BY STR_TO_DATE(datestring, '%d/%m/%Y')

我的 MySQL 语句如下所示:

SELECT stringdate
FROM mytable
WHERE product = '#myproduct#'
ORDER BY STR_TO_DATE(stringdate, '%m/%d/%y') DESC

但是,结果排序不正确。而不是上面显示的所需顺序,它显示如下:

12/31/2021
12/18/2021
11/27/2021
2/26/2022
2/19/2022
2/12/2022
2/5/2022

好像忽略了年份。如何在不实际更改数据库字段声明的情况下对其进行排序?

提前致谢。

2/5/2022 是不带前导零的月份和日期,以及四位数的年份。您指定的格式字符串是 -

  • %m - 月份,数字 (00..12)
  • %d - 一个月中的第几天,数字 (00..31)
  • %y - 年份,数字(两位数)
SELECT stringdate
FROM mytable
WHERE product = '#myproduct#'
ORDER BY STR_TO_DATE(stringdate, '%c/%e/%Y') DESC
  • %c - 月份,数字 (0..12)
  • %e - 一个月中的第几天,数字 (0..31)
  • %Y - 年份,数字,四位数

执行以下查询显示转换日期的差异 -

SELECT
    stringdate, 
    STR_TO_DATE(stringdate, '%m/%d/%y'), 
    STR_TO_DATE(stringdate, '%c/%e/%Y')
FROM mytable
WHERE product = '#myproduct#'
ORDER BY STR_TO_DATE(stringdate, '%c/%e/%Y') DESC

db<>fiddle

https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format

%y 是 two-digit 年代码。所以你将它们全部排序为“20”

%Y 是 four-digit 年代码。

请参阅此处的日期格式代码参考:https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format

我建议您使用 DATE 数据类型而不是 CHAR