SQL преобразовать дату dmmyyyy и ddmmyy в yyyy-mm-dd - PullRequest
2 голосов
/ 11 марта 2019

У меня следующая проблема.У меня есть некоторые даты со следующим форматом «15122019», и мне нужно это в этом формате 2019-12-15, который я уже решил следующим образом.

select convert (date, Stuff(Stuff('15122018',5,0,'.'),3,0,'.'),104)

Реальная проблема заключается в том, что когда даты приходят примерно так: «3122019», преобразование не может быть выполнено, потому что длина короче.Есть ли другой способ сделать это?Я пытался решить это в течение нескольких часов.И еще один вопрос, может ли этот запрос быть параметризованным?

Ответы [ 3 ]

3 голосов
/ 11 марта 2019

Попробуйте это:

 DECLARE @date VARCHAR(20)
 SET @date ='3122019'

 IF(LEN(@date) = 8)
 BEGIN  
    SET @date = Stuff(Stuff(@date,5,0,'.'),3,0,'.');
    SELECT CONVERT(DATE, @date , 103);
 END
 ELSE IF(LEN(@date) = 7) 
 BEGIN

    SET @date = Stuff(Stuff(@date,4,0,'.'),2,0,'.');
    IF(ISDATE(@date)=1)
    BEGIN
        SELECT CONVERT(DATE, @date , 103);          
    END    
    ELSE
    BEGIN
        SET @date = Stuff(Stuff(@date,4,0,'.'),3,0,'.');    
            SELECT CONVERT(DATE, @date , 103);
    END
 END
 ELSE IF(LEN(@date) = 6)
 BEGIN
     SET @date = Stuff(Stuff(@date,3,0,'.'),2,0,'.');
     SELECT CONVERT(DATE, @date , 103);
 END
0 голосов
/ 11 марта 2019

Вы можете добавить 0 влево и взять 8 символов с помощью right. как RIGHT('0'+'15122018',8). это работает с 15122018 и 3122018

select convert (date, Stuff(Stuff( RIGHT('0'+'15122018',8) ,5,0,'.'),3,0,'.'),104)
0 голосов
/ 11 марта 2019

Такой диалог может быть достигнут следующим образом:

  • Преобразование целочисленного значения в DATE с использованием промежуточного преобразования FORMAT в распознаваемый для образца строки диалога.
    • стиль 105 применяется для сопоставления ввода как dd-mm-yyyy
    • стиль 05 для соответствия dd-mm-yy

SQL:

-- input format: dmmyyyy
SELECT CONVERT(DATE, FORMAT(3012019, '##-##-####'), 105)
-- result: 2019-01-03

-- input format: dmmyy
SELECT CONVERT(DATE, FORMAT(30119, '##-##-##'), 05)
-- result: 2019-01-03

Это будет нормально работать с однозначным (и двузначным) номером дня, однако для него действительно требуется двузначный месяц

...