sql - SQL Server 将 MMM-YYYY 转换为真实日期
问题描述
我有 2019 年 4 月、2019 年 5 月等形式的日期,这些日期存储在字段名称 MonthYear 中。
但是,当我按 MonthYear 使用 order 对数据进行排序时,它会按字母顺序对数据进行排序(即)
我如何将 MonthYear 转换为真实日期,以便它以正确的顺序显示 MonthYear。
解决方案
我有 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
推荐阅读
- authentication - 我在 laravel 中有两个登录重定向条件,无论是同一页面还是仪表板 | 拉拉维尔
- apache-spark - 在 Kubernetes spark-operator 中,Pod 安全上下文不适用于 spark 驱动程序和执行程序
- python - 如何“加入/关联”2个数据帧,以便左侧数据帧的每一行都“附加”到右侧数据帧的每一行
- r - Trace back - find if a string value occurs before another specific string value - dplyr/R
- javascript - React 道具和状态值不更新
- android - 如何解决在 jni 中获取 methodID 的问题
- javascript - 承诺已解决,但代码在等待中停止
- python - 如何搜索对象(或其子对象)是否包含给定名称的字段并验证其值
- string - 如何在绘图功能中使用交替文本字符串
- makefile - 在 Makefile 中,是否总是附加变量 $(CFLAG) ?