首页 > 解决方案 > SQL Server 将 MMM-YYYY 转换为真实日期

问题描述

我有 2019 年 4 月、2019 年 5 月等形式的日期,这些日期存储在字段名称 MonthYear 中。

但是,当我按 MonthYear 使用 order 对数据进行排序时,它会按字母顺序对数据进行排序(即)

在此处输入图像描述

我如何将 MonthYear 转换为真实日期,以便它以正确的顺序显示 MonthYear。

标签: sqlsql-server

解决方案


我有 2019 年 4 月、2019 年 5 月等形式的日期,这些日期存储在字段名称 MonthYear 中。

这就是你问题的根源。你不应该在你的表中存储这些值。
相反,存储正确的日期,并将它们转换为您想要在表示层中的任何字符串表示形式。

请务必将日期存储在具有有意义的描述性名称的列中。不要调用它,Date因为它实际上不是您关心的日期,它是月份和年份的组合。但是,MonthYear也可能不是此列名称的最佳选择。

我会建议MonthStartDate或类似的东西。
该名称既描述了列存储的数据,也意味着您需要处理的日期分辨率是月份而不是日期。

如果需要,您可以向表中添加计算列来存储日期的 MMM-YYYY 值。这将允许您保持现在的表示层,但是请记住,提供准备显示的数据不应该是数据库的责任。

这是一个演示:

创建示例表:

DECLARE @TBL TABLE (
    MonthStartDate date,
    MonthYear AS REPLACE(RIGHT(CONVERT(char(11), MonthStartDate, 113), 8), ' ', '-') 
);

填充表格:

INSERT INTO @TBL (MonthStartDate) VALUES
('2019-01-01'), ('2019-02-01'), ('2019-03-01'),
('2019-04-01'), ('2019-05-01'), ('2019-06-01'),
('2019-07-01'), ('2019-08-01'), ('2019-09-01'),
('2019-10-01'), ('2019-11-01'), ('2019-12-01'),
('2020-01-01');

验证 MonthYear 列是否返回所需的结果:

SELECT MonthStartDate, MonthYear
FROM @TBL
ORDER BY MonthStartDate

结果:

MonthStartDate  MonthYear
2019-01-01      Jan-2019
2019-02-01      Feb-2019
2019-03-01      Mar-2019
2019-04-01      Apr-2019
2019-05-01      May-2019
2019-06-01      Jun-2019
2019-07-01      Jul-2019
2019-08-01      Aug-2019
2019-09-01      Sep-2019
2019-10-01      Oct-2019
2019-11-01      Nov-2019
2019-12-01      Dec-2019
2020-01-01      Jan-2020

推荐阅读