Я импортировал таблицу в 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
2
Nimko 4 Янв 2016 в 15:07

3 ответа

Лучший ответ
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
0
Mian Asbat Ahmad 4 Янв 2016 в 15:34

Ваш пример вывода не соответствует вашим входным данным. Я думаю, вы имели в виду 1985-01-08.

Для более короткого решения вы можете использовать CAST или CONVERT со стилем 107. Ожидается, что строка будет в формате Mon dd, yyyy:

SELECT  CONVERT(datetime, SUBSTRING(DateColumn, 5, 6) + ', ' + RIGHT(DateColumn, 4), 107)
FROM    MyTable
0
Code Different 4 Янв 2016 в 13:12

Это решение предполагает, что каждая строка в исходных данных имеет один и тот же формат. Если есть какие-то особые случаи, они потерпят неудачу.

В SQL Server 2012 и выше у вас есть удобная функция DATEFROMPARTS. Эта функция возвращает дату после прохождения года, месяца и дня. Их можно извлечь с помощью SUBSTRING и RIGHT из исходной строки.

Извлечение номера месяца (1 ~ 12) достигается построением произвольной строки даты (01- ммм -2000). Он преобразуется в дату, из которой извлекается номер месяца. Вообще говоря, я бы не рекомендовал использовать строки даты в любом формате, кроме ГГГГ-ММ-ДД. Однако это позволяет избежать использования CTE, что очень хотелось сделать 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, используемое для поиска номера месяца из трехзначного названия месяца. Это было заменено.

1
David Rushton 4 Янв 2016 в 12:42