如何将BST和GMT格式的字符串日期转换为SQL Server格式作为日期类型

时间:2016-01-04 12:07:40

标签: sql-server sql-server-2005 sql-server-2014

我将一个表导入SQL Server 2014,我发现日期格式为BSTGST格式。我想创建一个视图并将整个列更改为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

3 个答案:

答案 0 :(得分:1)

此解决方案假定源数据中的每一行都遵循相同的格式。如果有任何边缘情况,这些将失败。

使用SQL Server 2012及更高版本,您可以使用方便的DATEFROMPARTS功能。此函数返回传递年,月和日的日期。可以使用源代码字段中的SUBSTRINGRIGHT提取这些内容。

通过构建任意日期字符串(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