如何将“YYYYMM”格式转换为“YYYY-MM-00”?

Posted

技术标签:

【中文标题】如何将“YYYYMM”格式转换为“YYYY-MM-00”?【英文标题】:How to convert "YYYYMM" format to "YYYY-MM-00"? 【发布时间】:2020-10-06 19:34:11 【问题描述】:

我在 mysql 中有一个示例表

id     yearmonth     
1      202001        
2      202002
3      202011
4      202012
5      201912
6      201911

mysql中想要的表是

id     yearmonth  
 1     2020-01-00
 2     2020-02-00
 3     2020-11-00
 4     2020-12-00
 5     2019-12-00
 6     2019-11-00

由于第一张表的年月列中没有日值,我们可以用默认值替换。

寻求您的帮助!提前致谢!

【问题讨论】:

00 在 DATE 的数据类型值 DAY 部分不正确。您希望最终值具有字符串数据类型吗? 不,我正在寻找 date_format。不是字符串格式。 这些日期无效,该月没有第 0 天。 是的,但我只是将这一天作为默认一天。我并没有真正在任何地方使用它。我可以用01代替00,我只是在寻找转换成YYYY-MM-DD格式的方法。 我可以用 01 替换 00。 如果你想有稳定的解决方案,你必须。例如,SELECT CAST(yearmonth*100+1 AS DATE) ... 【参考方案1】:

您也可以使用STR_TO_DATE 函数。

SELECT STR_TO_DATE('202001','%Y%m');
Output:
2020-01-00

如果您想将day 设置为默认值。只需使用DATE_FORMAT

SELECT DATE_FORMAT(STR_TO_DATE('202001','%Y%m'), '%Y-%m-01');
Output:
2020-01-01

正如@Akina 提到的,它依赖于NO_ZERO_IN_DATE 并可能导致null 结果。你可以寻找这个替代方案

SELECT CONCAT(LEFT('202010',4) , '-' , RIGHT('202010',2) , '-01');

如果你想要date 类型,那么你可以使用CAST 显式。

SELECT CAST( CONCAT(LEFT('202010',4) , '-' , RIGHT('202010',2) , '-01') AS DATE);

【讨论】:

fiddle 不同意你的意见...两个查询都返回 NULL。 它在我的本地运行得很好,让我也检查一下你的小提琴。 您的查询有效性取决于服务器的 SQL 模式 - 即它通常是无效的。因为任何服务器设置更改都可能会终止应用程序,并且恢复可能非常昂贵。 @NikhilGarakapati 那是你的选择......和你的耙子。 NO_ZERO_IN_DATE,更准确地说。【参考方案2】:

如何将 yearmonth 列数据值与您想要的默认日期值连接,然后使用 STR_TO_DATE 更改为日期格式:

SELECT STR_TO_DATE(CONCAT(yearmonth,'01'), '%Y%m%d') FROM test;

或者使用DATE_FORMAT:

SELECT DATE_FORMAT(CONCAT(yearmonth,'01'), '%Y-%m-%d') FROM test;

Fiddle

【讨论】:

以上是关于如何将“YYYYMM”格式转换为“YYYY-MM-00”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中将 yyyymm 数据格式解析为 Month、YYYY 格式?

如何将整数转换为月和年格式

如何使用 Big Query SQL Standard 将日期 YYYY-MM-DD 转换为字符串 YYYYMM?

js时间转换,能够把时间转换成yyyymmdd格式或yyyymm格式

从日期时间列中提取 YYYY-MM

如何设置像'YYYYMM'这样的Postgresql默认值日期戳?