将月份和年份列转换为带有附加字符串连接的日期列
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
,而是将INT
s 用于年份和月份...如果您要在所有需要的地方创建日期,您的方法会膨胀很多...【参考方案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 年开始,使用 FORMAT
和 CONCAT
可能会更轻松
提示:注意文化/语言设置!
如您所见,我的系统生成了“Mai”,即“May”的德语拼写。依赖于文化的格式(更糟糕的是:依赖于语言的格式)是非常危险的......
【讨论】:
以上是关于将月份和年份列转换为带有附加字符串连接的日期列的主要内容,如果未能解决你的问题,请参考以下文章