Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Atualizando valores de string em uma tabela a ser flopada, como string YYYYMMDD para string MMDDYYYY


Supondo que nossa coluna de data seja char ou varchar , você poderia fazer algo assim
update foo
set dates = right(dates,4) + left(dates,4)

Ou isto
update foo
set dates = replace( convert(varchar,convert(datetime,dates,112),110) , '-' , '' )

Se tudo o que você quer fazer é exibir seu texto de forma diferente, a maneira mais fácil é
select ... ,
       dates = right(dates,4) + left(dates,4)
from foo

Ou crie uma visualização e use-a em vez da tabela original:
create view foo_view
as select id ,
          dates = right(dates,4) + left(dates,4)
   from foo

Mas se você usar tipos de dados de data/hora reais, os usuários de seus dados os mapearão para tipos de data/hora adequados no cliente e poderão escolher a melhor forma de exibi-los para suas necessidades.

A outra vantagem de usar tipos de data/hora é que eles reforçam a integridade de dados . Aguarde até que alguém adicione ou altere uma data para torná-la inválida — digamos, `20142331'. Então, quando você precisar exibir esses dados em um formulário com um nome de mês ('22 de janeiro de 2014, digamos), a hilaridade ocorrerá quando você receber uma exceção tentando mapear o número do mês para um nome de mês.

Se você não for usar um tipo de data/hora, armazene ano, mês e dia individualmente como valores inteiros com restrições de verificação adequadas para reforçar a integridade:
create table foo
(
  id   int not null identity(1,1) primary key ,
  yyyy int not null check ( yyyy between 1900 and 2100 ) ,
  mm   int not null check ( mm between 1 and 12 ) ,
  dd   int not null check ( dd between 1 and ( case mm
                                                 when  4 then 30
                                                 when  6 then 30
                                                 when  9 then 30
                                                 when 11 then 30
                                                 when  2 then case
                                                                when yyyy % 400 = 0 then 29
                                                                when yyyy % 100 = 0 then 28
                                                                when yyyy % 4   = 0 then 29
                                                                else                     28
                                                              end
                                                 else 31
                                               end
                                             )
                          )