我将一个表导入SQL Server 2014,我发现日期格式为BST
和GST
格式。我想创建一个视图并将整个列更改为SQL Server日期类型以执行操作。我不介意截断时间段。
Wed Apr 07 00:00:00 BST 1943
Tue Jan 08 00:00:00 GMT 1985
我能够使用以下公式在Excel中执行此操作,但希望在SQL Server中执行此操作:
=IFERROR(DATEVALUE(MID(E2,9,2)&"-"&MID(E2,5,3)&"-"&RIGHT(E2,4)), "")
我正在寻找的是
1943-04-07
1985-01-08
答案 0 :(得分:1)
此解决方案假定源数据中的每一行都遵循相同的格式。如果有任何边缘情况,这些将失败。
使用SQL Server 2012及更高版本,您可以使用方便的DATEFROMPARTS功能。此函数返回传递年,月和日的日期。可以使用源代码字段中的SUBSTRING和RIGHT提取这些内容。
通过构建任意日期字符串(01- mmm -2000)来提取月份数(1~12)。这将被转换为日期,从中提取月份编号。一般来说,我不建议使用除YYYY-MM-DD以外的任何格式的日期字符串。然而,这避免了使用OP,而OP非常希望这样做。
实施例
/* Let's create some sample values to
* experiment with.
*/
DECLARE @Sample TABLE
(
DateVal VARCHAR(50)
)
;
INSERT INTO @Sample
(
DateVal
)
VALUES
('Wed Apr 07 00:00:00 BST 1943'),
('Tue Jan 08 00:00:00 GMT 1985')
;
/* Extracting the month number is achieved by first casting the 3 character month
* name as a full date, by appended a day and year. Then the month number is
* extracted from this.
*/
SELECT
s.DateVal,
SUBSTRING(s.DateVal, 9, 2) AS [Day],
MONTH(CAST('01-' + SUBSTRING(s.DateVal, 5, 3) + '-2000' AS DATE)) AS [Month],
RIGHT(s.DateVal, 4) AS [Year],
-- Reuse the values shown above.
DATEFROMPARTS(
RIGHT(s.DateVal, 4),
MONTH(CAST('01-' + SUBSTRING(s.DateVal, 5, 3) + '-2000' AS DATE)),
SUBSTRING(s.DateVal, 9, 2)
) AS [Date]
FROM
@Sample AS s
;
编辑:原始解决方案包含CTE,用于从3个字符的月份名称中查找月份编号。这已被取代。
答案 1 :(得分:0)
您的示例输出与输入数据不匹配。我认为你的意思是1985-01-08
。
对于较短的解决方案,您可以将CAST or CONVERT与样式107一起使用。它希望字符串采用Mon dd, yyyy
格式:
SELECT CONVERT(datetime, SUBSTRING(DateColumn, 5, 6) + ', ' + RIGHT(DateColumn, 4), 107)
FROM MyTable
答案 2 :(得分:0)
SELECT CONVERT(date, RIGHT(DateColumn, 4)+ '-' + RIGHT('0' + Convert(nvarchar, (Month(SUBSTRING(DateColumn, 5, 3) + '2016'))), 2) + '-' + SUBSTRING(DateColumn, 9, 2)) as dob
FROM MyTable