【问题标题】:Convert March 2015 to 03/2015 and make into date将 2015 年 3 月转换为 03/2015 并成为日期
【发布时间】:2015-06-23 12:27:34
【问题描述】:

我有一列包含格式为“2015 年 6 月”、“2015 年 7 月”、“2014 年 3 月”、“2016 年 2 月”的值。

我需要将这些格式转换为 06/2015、07/2015、03/2014、02/2016.. 但还要将它们设为日期,以便我可以按此列排序。

我目前有以下选择:

SELECT CONCAT(MONTH(STR_TO_DATE(LEFT(SUBSTRING_INDEX(quotation.quotation_exp_conversion_date, ' ', 1),3), '%b')), '/', SUBSTRING_INDEX(quotation.quotation_exp_conversion_date, ' ', -1)) AS exp_conversion_date
FROM quotation
WHERE quotation.quotation_status = 'LIVE'
ORDER BY exp_conversion_date ASC

有两个问题。此查询将值转换为格式“6/2015”、“7/2015”、“3/2014”、“2/2016”(对于单个数字月份没有前导 0),并且没有正确排序,因为不考虑 YEAR - 所以它们被订购: '2/2016'、'3/2014'、'6/2015'、'7/2015'

我尝试将其全部包装在 DATE() 函数中,但它只为所有值返回了 NULL

关于如何实现我想要的任何想法?

谢谢

【问题讨论】:

  • 如果您将其转换为DATE 之类的数据类型,它不会具有 格式 - 这就是重点,它包含日期,而不是 字符串 表示日期。但是,如果您乐于使用字符串,为什么不转换为 YYYY-MM 格式 - alphabetical 排序自然会产生所需排序顺序的格式?

标签: mysql date


【解决方案1】:

STR_TO_DATE 适合我,格式为“%M %Y”:

mysql> select str_to_date('July 2015', '%M %Y');
+-----------------------------------+
| str_to_date('July 2015', '%M %Y') |
+-----------------------------------+
| 2015-07-00                        |
+-----------------------------------+
1 row in set (0.10 sec)

如果有某些原因您不能这样做,请扩展您的问题。

要将其转换为完整的查询(如果没有您的表格,我显然无法测试,所以 caveat lector):

SELECT DATE_FORMAT(d, '%m/%Y')
FROM 
  (SELECT str_to_date(quotation_exp_conversion_date, '%M %Y') AS d FROM quotation)
ORDER BY d ASC;

【讨论】:

  • 嗯,“00”是有效的一天吗? ;-)
  • @Ja͢ck:我认为如果您从不使用日期编号,这并不重要。这足以用于排序和格式化回原始表单。我猜它的 DATE 相当于 NULL...
  • 谢谢我的朋友。这也比我的查询更容易准备;)
猜你喜欢
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
相关资源
最近更新 更多