convertendo INT para DATE / TIME

2

Eu tenho uma tabela que contém valores de data e hora como tipo de dados INT. por exemplo, uma data é armazenada como YYYYMMDD, como 20110901 e uma hora é armazenada como HHMMSS, como 21826.

A data está próxima do padrão ISO, por isso não é um problema muito grande, mas alguém pode sugerir uma maneira simples de converter para um tipo TIME, por favor? Eu inventei uma combinação hedionda de concatenação, reversão, substring, convert que estou preocupado será difícil de ler por outro pessoal.

    
por Fatherjack 07.09.2011 / 13:09

2 respostas

4

O que você quer fazer é pegar sua "combinação horrorosa" e adaptá-la para converter esses pares inteiros em valores de data e hora. Em seguida, testar o heck fora dele com tantos casos de borda como você pode chegar a, talvez até mesmo verificar manualmente contra um subconjunto aleatório de seus dados reais. Se você tiver muita sorte, poderá usar o código existente que exibe seus dados como uma string e escrever um script que compare a saída do seu código de conversão com a saída real para garantir que todas as instâncias se alinhem e garantam a perfeição.

Quando o código estiver pronto, use-o exatamente uma vez para copiar os dados para uma nova coluna de data e hora que você adicionará à tabela para essa finalidade. Depois disso, remova a coluna antiga e renomeie a nova para corresponder ao nome antigo. Agora atualize qualquer código que insira / atualize / leia a partir da coluna original para usar um tipo de dados datetime. Então nunca mais fale sobre isso.

Para que tudo isso ocorra sem problemas, você precisará coordenar a execução dos scripts de ajuste da tabela com a implantação do novo código do aplicativo. Se este é um aplicativo 24/7 que pode ser complicado, mas o resultado deve valer a pena.

    
por 06.02.2012 / 03:59
1

Isso é o melhor que posso fazer.

select
-- convert string to time value
CONVERT(time
    -- insert a colon between hours and minutes (position 3)
    , STUFF(
        -- insert a colon between minutes and seconds (position 5)
        STUFF(
            -- convert to string, pad left with zeroes to 6 characters
            RIGHT('000000' + CONVERT(varchar(6), @time_value_int), 6) 
        , 5, 0, ':')
    , 3, 0, ':')
) as time_converted

Inicialmente iniciei a rota matemática tomando o valor de tempo inteiro e usando divisão de inteiros e módulo para obter as partes de horas, minutos e segundos, e multiplicando pelo equivalente de flutuação daquela parte de tempo (horas = 1 / 24.0, minutos = (1 / 24.0 / 60.0), segundos = (1 / 24.0 / 3600.0), em seguida, adicionando os dois juntos, apenas para descobrir que você não pode converter um float para o tipo de dados TIME.É encoberto para DATETIME, que você pode então converta para TIME, mas parece que há uma perda na precisão, então o resultado pode ser de alguns milissegundos.

Assim, a abordagem de texto munging parece mais limpa.

    
por 06.02.2012 / 00:00