Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Aktualisieren von Zeichenfolgenwerten in einer Tabelle, die umgetauscht werden sollen, z. B. YYYYMMDD-Zeichenfolge in MMDDYYYY-Zeichenfolge

Angenommen, unsere Datumsspalte ist char oder varchar , könnten Sie so etwas tun

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

Oder das

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

Wenn Sie nur Anzeigen möchten Ihren Text anders, das ist am einfachsten

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

Oder erstellen Sie eine Ansicht und verwenden Sie diese anstelle der ursprünglichen Tabelle:

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

Wenn Sie jedoch tatsächliche Datums-/Uhrzeitdatentypen verwenden, werden die Benutzer Ihrer Daten geeigneten Datums-/Uhrzeittypen im Client zugeordnet und können dann auswählen, wie sie für ihre Bedürfnisse am besten angezeigt werden.

Der andere Vorteil der Verwendung von Datums-/Uhrzeittypen besteht darin, dass sie die Datenintegrität erzwingen . Warten Sie, bis jemand ein Datum hinzufügt oder ändert, um es ungültig zu machen – sagen wir „20142331“. Wenn Sie diese Daten dann in einem Formular mit einem Monatsnamen anzeigen müssen (z. B. „22. Januar 2014“), kommt es zu Heiterkeit, wenn Sie eine Ausnahme erhalten, die versucht, die Monatsnummer einem Monatsnamen zuzuordnen.

Wenn Sie keinen Datums-/Uhrzeittyp verwenden, speichern Sie Jahr, Monat und Tag einzeln als Ganzzahlwerte mit geeigneten Prüfbedingungen, um die Integrität zu erzwingen:

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