把一个写好的月份变成一个数字mysql

  • 本文关键字:一个 mysql 数字 mysql
  • 更新时间 :
  • 英文 :


我在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

最新更新