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

Posted

技术标签:

【中文标题】将月份和年份列转换为带有附加字符串连接的日期列【英文标题】:Convert month and year columns to a date column with additional string concatination 【发布时间】:2017-03-09 08:36:34 【问题描述】:

我的 TB1

MONTH    YEAR 
-----    ----
2        2015

如何:-

M_DELIVERY            Description
----------           -------------
FEB-15              DELIVERY FOR FEB 2015

【问题讨论】:

缺少样本数据和细节。 你能停止滥用格式和全大写吗?这不会让您更好或更快地回答您的问题。请阅读How to Ask 并展示您的尝试。 【参考方案1】:

假设您使用的是日期和 MSSQL2012+:

SELECT  UPPER( FORMAT(CONVERT(datetime, '2017-02-01',121),'MMM')) + '-' +RIGHT(CAST( YEAR( CONVERT(datetime, '2017-02-01',121)) AS VARCHAR(4)),2) M_DELIVERY
, 'DELIVERY FOR ' +UPPER( FORMAT(CONVERT(datetime, '2017-02-01',121),'MMM'))+' '+ CAST( YEAR( CONVERT(datetime, '2017-02-01',121)) AS VARCHAR(4)) AS Description

其他方式(使用数字而不是日期): (您可以更改月份名称缩写。)

SELECT  SUBSTRING('GENFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC',1+(MONTH_NUMB-1)*3,3)+'-'+ RIGHT(YEAR_NUMB,2) AS M_DELIVERY
    , 'DELIVERY FOR ' + SUBSTRING('GENFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC',1+(MONTH_NUMB-1)*3,3)+' '+ CAST(YEAR_NUMB AS VARCHAR(4)) AS DESCRIPTION
    FROM /* sample data */ (SELECT 2 AS MONTH_NUMB, 2015 AS YEAR_NUMB
          UNION SELECT 12 AS MONTH_NUMB, 2017 AS YEAR_NUMB
          UNION SELECT 1 AS MONTH_NUMB, 2016 AS YEAR_NUMB) X

后者的输出:

M_DELIVERY DESCRIPTION
---------- ---------------------
GEN-16     DELIVERY FOR GEN 2016
FEB-15     DELIVERY FOR FEB 2015
DIC-17     DELIVERY FOR DEC 2017

【讨论】:

顺便提一下:FORMAT 需要 SQL Server 2012+。此外,OP 不使用DATETIME,而是将INTs 用于年份和月份...如果您要在所有需要的地方创建日期,您的方法会膨胀很多...【参考方案2】:

你的问题很“细”...关于你的下一个问题,请阅读How to ask a good SQL question和How to create a MCVE

为此,您可以在这里尝试:

DECLARE @Dummy TABLE(TheMonth INT,TheYear INT);
INSERT INTO @Dummy VALUES(2,2015),(5,2017);

SELECT d.TheMonth
      ,d.TheYear
      ,A.AsDateTime
      ,UPPER(CONVERT(VARCHAR(3),A.AsDateTime,100)) + '-' + RIGHT(CONVERT(VARCHAR(100),A.AsDateTime,101),2) AS ShortString
      ,'DELIVERY FOR ' + UPPER(CONVERT(VARCHAR(3),A.AsDateTime,100)) + ' ' + CAST(d.TheYear AS VARCHAR(4)) AS LongString
FROM @Dummy AS d
CROSS APPLY(SELECT CAST(CAST(d.TheYear AS VARCHAR(4)) + REPLACE(STR(d.TheMonth,2),' ','0')+'01' AS DATETIME)) AS A(AsDateTime);

返回

M   Y       AsDateTime              ShortString LongString
2   2015    2015-02-01 00:00:00.000 FEB-15      DELIVERY FOR FEB 2015
5   2017    2017-05-01 00:00:00.000 MAI-17      DELIVERY FOR MAI 2017

您没有提供 SQL Server 的版本。从 2012 年开始,使用 FORMATCONCAT 可能会更轻松

提示:注意文化/语言设置!

如您所见,我的系统生成了“Mai”,即“May”的德语拼写。依赖于文化的格式(更糟糕的是:依赖于语言的格式)是非常危险的......

【讨论】:

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

将日期列转换为周数、日期、月份、年份

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

将字符串转换为日期 [带年份和季度]

需要从redshift中的日期列中划分月份和年份

熊猫将带有年份整数的列转换为日期时间

将一列日期数字转换为缩写月份