Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Aggiornamento dei valori di stringa in una tabella da floppare, ad esempio la stringa AAAAMMGG in stringa MMDGGAAAA

Supponendo che la nostra colonna della data sia char o varchar , potresti fare qualcosa del genere

update foo
set dates = right(dates,4) + left(dates,4)

O questo

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

Se tutto ciò che vuoi fare è visualizzare il tuo testo in modo diverso, il modo più semplice è

select ... ,
       dates = right(dates,4) + left(dates,4)
from foo

Oppure crea una vista e usala al posto della tabella originale:

create view foo_view
as select id ,
          dates = right(dates,4) + left(dates,4)
   from foo

Ma se utilizzi tipi di dati di data/ora effettivi, gli utenti dei tuoi dati li mappano a tipi di data/ora adeguati nel client e possono quindi scegliere il modo migliore per visualizzarli per le loro esigenze.

L'altro vantaggio dell'utilizzo dei tipi di data/ora è che applicano l'integrità dei dati . Attendi che qualcuno aggiunga o modifichi una data per renderla non valida, ad esempio "20142331". Quindi, quando devi visualizzare quei dati in un modulo con il nome di un mese ("22 gennaio 2014, ad esempio), ne deriverà ilarità quando ottieni un'eccezione cercando di mappare il numero del mese con il nome di un mese.

Se non intendi utilizzare un tipo di data/ora, archivia anno, mese e giorno singolarmente come valori interi con vincoli di controllo adeguati per rafforzare l'integrità:

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
                                             )
                          )