仅将带有年份和月份的字符串转换为仅适用于年份和月份的日期格式

Posted

技术标签:

【中文标题】仅将带有年份和月份的字符串转换为仅适用于年份和月份的日期格式【英文标题】:Convert string with Year and Month ONLY... to the date format for Year and Month only 【发布时间】:2017-11-03 15:47:03 【问题描述】:

有点奇怪的问题,但我将年/月的行和行作为字符串,我正在尝试将其转换为日期格式。

不太确定这是否可以完成,因为它不是一个完整的日期,但值得一问。

UPDATE table
SET [Year Month] = CONVERT (DATE, [Year Month], 103)

返回

Conversion failed when converting date and/or time from character string.

数据字符串如下所示:

|Year Month|
| 2015-02  |
| 2016-06  |
| 2016-01  |
| 2020-09  |

看过其他帖子,但它们都源于已经有了完整的日期,并且基本上只是截断日期以获取年份月份等,但在这种情况下,它是我作为字符串的唯一年份和月份,并且需要格式化成日期年月

【问题讨论】:

您想要的日期是几号? 01 或月底?还是别的什么? 什么版本的 SQL Server? select @@version 我只想返回上面相同的数据,但将其替换为日期格式而不是字符串 Microsoft SQL Server 2016 (SP1-GDR) (KB4019089) - 13.0.4206.0 (X64) Jul 6 2017 07:55:03 版权所有 (c) Microsoft Corporation Express Edition(64 位)跨度> @VS1SQL 为了让它成为DATE,它必须是一个有效的日期。并且有效日期已定义day 【参考方案1】:

您需要选择一天(此处为每月的第一天)将包含一对 year/month 的文本字段转换为有效的日期字段:

SQL Server(将ISO dateYYYY-MM-DD、YYYY/MM/DD、YYYYMMDD...转换为日期):

UPDATE table
SET [Year Month Day] = cast([Year Month] + '-01' as DATE )

Oracle(您可以明确选择格式):

UPDATE table
SET YearMonthDay = TO_DATE(YearMonth || '-01', 'YYYY-MM-DD' )

【讨论】:

【参考方案2】:

您可以从 SQL Server 2012 开始使用 DATEFROMPARTS,但您必须指定日期才能使其成为 DATE

--set to first day of month
UPDATE table
SET [Year Month] = DATEFROMPARTS ( LEFT([Year Month], 4), RIGHT([Year Month], 2) , 1 ) 

示例

DECLARE @Year_Month VARCHAR(7) = '2015-02'

SELECT DATEFROMPARTS ( LEFT(@Year_Month, 4), RIGHT(@Year_Month, 2) , 1 ) 

【讨论】:

以上是关于仅将带有年份和月份的字符串转换为仅适用于年份和月份的日期格式的主要内容,如果未能解决你的问题,请参考以下文章

将月份和年份列转换为带有附加字符串连接的日期列

如何在包含单词、三个字母月份和两位数字年份的字符串中搜索月份和年份并将它们转换为 SQL 中的日期?

如何获取带有年份的月份名称和两个日期之间的年份列表

折叠档案问题

如何在 MySql 中将月份-年份转换为月份单词?

循环浏览带有年份的月份列表以检查文件是不是存在