我在mysql:中有这样的结构
+----+---------------+------+
| ID | DATE | WHAT |
+----+---------------+------+
| 1 | GENNAIO 2020 | 1 |
+----+---------------+------+
| 2 | FEBBRAIO 2021 | 2 |
+----+---------------+------+
| 3 | GENNAIO 2020 | 1 |
+----+---------------+------+
我应该能够按日期排序,不幸的是,我被写在信中,不知道如何处理。我强调我不能使用id,因为条目可能与书面日期不同。
PS。月份用意大利语书写(一月、二月(
来自@Tim Biegeleisen 建议的完整答案
SELECT `ID`,`DATE`,CASE
WHEN `DATE` LIKE '%GENNAIO%' THEN CONCAT(SUBSTRING_INDEX(`DATE`, ' ', -1),'-','01','-10')
WHEN `DATE` LIKE '%FEBBRAIO%' THEN CONCAT(SUBSTRING_INDEX(`DATE`, ' ', -1),'-','02','-10')
WHEN `DATE` LIKE '%MARZO%' THEN CONCAT(SUBSTRING_INDEX(`DATE`, ' ', -1),'-','03','-10')
WHEN `DATE` LIKE '%APRILE%' THEN CONCAT(SUBSTRING_INDEX(`DATE`, ' ', -1),'-','04','-10')
WHEN `DATE` LIKE '%MAGGIO%' THEN CONCAT(SUBSTRING_INDEX(`DATE`, ' ', -1),'-','05','-10')
WHEN `DATE` LIKE '%GIUGNO%' THEN CONCAT(SUBSTRING_INDEX(`DATE`, ' ', -1),'-','06','-10')
WHEN `DATE` LIKE '%LUGLIO%' THEN CONCAT(SUBSTRING_INDEX(`DATE`, ' ', -1),'-','07','-10')
WHEN `DATE` LIKE '%AGOSTO%' THEN CONCAT(SUBSTRING_INDEX(`DATE`, ' ', -1),'-','08','-10')
WHEN `DATE` LIKE '%SETTEMBRE%' THEN CONCAT(SUBSTRING_INDEX(`DATE`, ' ', -1),'-','09','-10')
WHEN `DATE` LIKE '%OTTOBRE%' THEN CONCAT(SUBSTRING_INDEX(`DATE`, ' ', -1),'-','10','-10')
WHEN `DATE` LIKE '%NOVEMBRE%' THEN CONCAT(SUBSTRING_INDEX(`DATE`, ' ', -1),'-','11','-10')
WHEN `DATE` LIKE '%DICEMBRE%' THEN CONCAT(SUBSTRING_INDEX(`DATE`, ' ', -1),'-','12','-10')
END AS DATAA
FROM `mytable` order by DATAA DESC
我添加了%MONTHS%来查找月份,并添加了该月份的报价,以便11月和12月也能工作。显然,正如下面的评论中所指出的,使用数字中的日期总是更好的,事实上,我将使用这个查询来转换DB
您可以在此处使用CASE
表达式:
SELECT
ID,
DATE,
CASE WHEN DATE LIKE 'GENNAIO' THEN 1
WHEN DATE LIKE 'FEBBRAIO' THEN 2
... END AS MONTH
FROM yourTable;
处理此问题的更好方法是使用STR_TO_DATE
,将文本日期转换为真实日期,然后提取数字月份。这假设MySQL上的STR_TO_DATE
将支持意大利语的区域设置。但一个更好的方法是停止将日期存储为文本。只要使用一个真正的日期栏,就可以避免这些问题。
CASE
表达式更简单的是FIND_IN_SET()
:
SELECT id,
FIND_IN_SET(
SUBSTRING_INDEX(date, ' ', 1),
'GENNAIO,FEBBRAIO,MARZO,APRILE,MAGGIO,GIUGNO,LUGLIO,AGOSTO,SETTEMBRE,OTTOBRE,NOVEMBRE,DICEMBRE'
) month,
SUBSTRING_INDEX(date, ' ', -1) year
FROM mytable
请参阅演示
结果:
> id | month | year
> -: | ----: | :---
> 1 | 1 | 2020
> 2 | 2 | 2020
> 3 | 1 | 2020