在 SSIS 中将月份名称转换为月份编号
Convert month name to month number in SSIS
我有一个输入列 "MonthName",它的值采用以下字符串格式 22-MAY-2017 02:29:33.00
。我想将其转换为目标 table 中的 Datetime 数据类型。
为此,需要进行以下转换
22-MAY-2017 02:29:33.00
到 22-05-2017 02:29:33.00
如何在派生列任务中实现此目的。
我正在使用下面的表达式来获取值的月份名称部分,但我认为它并没有达到我的目的
SUBSTRING(MonthName,FINDSTRING(MonthName,"-",1) + 1,FINDSTRING(MonthName,"-",2) - FINDSTRING(MonthName,"-",1) - 1) <br/>
上面的表达式创建了一个包含所有月份名称的新列,例如:五月、六月、七月。
计算值可以使用Sql服务器的CONVERT
函数,不用搞SubString和FindString;然后通过 ALTER 命令将计算值添加到 table 定义中。唯一棘手的部分是找到要用于您的格式的格式类型,table 值在链接页面上。
概念验证:
CREATE TABLE Prototype (
PrototypeID INT IDENTITY(1,1) NOT NULL
, Month_Name VARCHAR(100) NOT NULL
) ON [PRIMARY]
GO
INSERT Prototype (Month_Name)
VALUES ('22-MAY-2017 02:29:33.00')
, ('22-apr-2017 02:29:33.00')
, ('22-Dec-2017 02:29:33.00')
GO
ALTER TABLE Prototype
ADD Month_DateTime AS Convert(DateTime, Month_Name, 107)
GO
SELECT * FROM Prototype
=======================
PrototypeID Month_Name Month_DateTime
1 22-MAY-2017 02:29:33.00 2017-05-22 02:29:33.000
2 22-apr-2017 02:29:33.00 2017-04-22 02:29:33.000
3 22-Dec-2017 02:29:33.00 2017-12-22 02:29:33.000
4 22-October-2017 02:29:33.00 2017-10-22 02:29:33.000
使用派生列转换
您可以使用以下表达式
LEFT([MonthName],3) +
(SUBSTRING( [MonthName],4,3) == "JAN" ? "01" :
SUBSTRING( [MonthName],4,3) == "FEB" ? "02" :
SUBSTRING( [MonthName],4,3) == "MAR" ? "03" :
SUBSTRING( [MonthName],4,3) == "APR" ? "04" :
SUBSTRING( [MonthName],4,3) == "MAY" ? "05" :
SUBSTRING( [MonthName],4,3) == "JUN" ? "06" :
SUBSTRING( [MonthName],4,3) == "JUL" ? "07" :
SUBSTRING( [MonthName],4,3) == "AUG" ? "08" :
SUBSTRING( [MonthName],4,3) == "SEP" ? "09" :
SUBSTRING( [MonthName],4,3) == "OCT" ? "10" :
SUBSTRING( [MonthName],4,3) == "NOV" ? "11" :
SUBSTRING( [MonthName],4,3) == "DEC"? "12":"")
+ RIGHT([MonthName],17)
使用脚本组件
如果日期列是字符串,您可以在脚本组件中使用 DateTime.ParseExact
方法。 (假设outDate
为输出列,inDate
为输入列)
using System;
using System.Globalization;
CultureInfo provider = CultureInfo.InvariantCulture;
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
Row.outDate = DateTime.ParseExact(Row.inDate,"dd-MMM-yyyy HH:mm:ss.ff",provider).ToString("dd-MM-yyyy HH:mm:ss.ff");
}
有关此方法的更多信息,您可以参考此 links:
也看看我在下面的回答link,很有帮助:
我有一个输入列 "MonthName",它的值采用以下字符串格式 22-MAY-2017 02:29:33.00
。我想将其转换为目标 table 中的 Datetime 数据类型。
为此,需要进行以下转换
22-MAY-2017 02:29:33.00
到 22-05-2017 02:29:33.00
如何在派生列任务中实现此目的。
我正在使用下面的表达式来获取值的月份名称部分,但我认为它并没有达到我的目的
SUBSTRING(MonthName,FINDSTRING(MonthName,"-",1) + 1,FINDSTRING(MonthName,"-",2) - FINDSTRING(MonthName,"-",1) - 1) <br/>
上面的表达式创建了一个包含所有月份名称的新列,例如:五月、六月、七月。
计算值可以使用Sql服务器的CONVERT
函数,不用搞SubString和FindString;然后通过 ALTER 命令将计算值添加到 table 定义中。唯一棘手的部分是找到要用于您的格式的格式类型,table 值在链接页面上。
概念验证:
CREATE TABLE Prototype (
PrototypeID INT IDENTITY(1,1) NOT NULL
, Month_Name VARCHAR(100) NOT NULL
) ON [PRIMARY]
GO
INSERT Prototype (Month_Name)
VALUES ('22-MAY-2017 02:29:33.00')
, ('22-apr-2017 02:29:33.00')
, ('22-Dec-2017 02:29:33.00')
GO
ALTER TABLE Prototype
ADD Month_DateTime AS Convert(DateTime, Month_Name, 107)
GO
SELECT * FROM Prototype
=======================
PrototypeID Month_Name Month_DateTime
1 22-MAY-2017 02:29:33.00 2017-05-22 02:29:33.000
2 22-apr-2017 02:29:33.00 2017-04-22 02:29:33.000
3 22-Dec-2017 02:29:33.00 2017-12-22 02:29:33.000
4 22-October-2017 02:29:33.00 2017-10-22 02:29:33.000
使用派生列转换
您可以使用以下表达式
LEFT([MonthName],3) +
(SUBSTRING( [MonthName],4,3) == "JAN" ? "01" :
SUBSTRING( [MonthName],4,3) == "FEB" ? "02" :
SUBSTRING( [MonthName],4,3) == "MAR" ? "03" :
SUBSTRING( [MonthName],4,3) == "APR" ? "04" :
SUBSTRING( [MonthName],4,3) == "MAY" ? "05" :
SUBSTRING( [MonthName],4,3) == "JUN" ? "06" :
SUBSTRING( [MonthName],4,3) == "JUL" ? "07" :
SUBSTRING( [MonthName],4,3) == "AUG" ? "08" :
SUBSTRING( [MonthName],4,3) == "SEP" ? "09" :
SUBSTRING( [MonthName],4,3) == "OCT" ? "10" :
SUBSTRING( [MonthName],4,3) == "NOV" ? "11" :
SUBSTRING( [MonthName],4,3) == "DEC"? "12":"")
+ RIGHT([MonthName],17)
使用脚本组件
如果日期列是字符串,您可以在脚本组件中使用 DateTime.ParseExact
方法。 (假设outDate
为输出列,inDate
为输入列)
using System;
using System.Globalization;
CultureInfo provider = CultureInfo.InvariantCulture;
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
Row.outDate = DateTime.ParseExact(Row.inDate,"dd-MMM-yyyy HH:mm:ss.ff",provider).ToString("dd-MM-yyyy HH:mm:ss.ff");
}
有关此方法的更多信息,您可以参考此 links:
也看看我在下面的回答link,很有帮助: