Обновление строковых значений в таблице, которая будет свернута вокруг, например, строки YYYYMMDD, в строку MMDDYYYY

У меня есть таблица, например, как

CREATE TABLE Test_Table ( ID int, ДАТЫ varchar (8) );

и моя таблица выглядит так, когда вы выбираете его

|   ID    |    Dates   |
------------------------
|    1    |  20140911  |
|    2    |  20140101  |
|    3    |  20140829  |

Я пытаюсь обновить свою таблицу так, чтобы строковое значение было MMDDYYYY вместо YYYYMMDD Например, это то, чего я пытаюсь достичь:

|   ID    |    Dates   |
------------------------
|    1    |  09112014  |
|    2    |  01012014  |
|    3    |  08292014  |

ПРИМЕЧАНИЕ. Я не пытаюсь выбрать таблицу или изменить значение в datetime. Все, что я пытаюсь сделать, это совместить числа и обновить таблицу, если это возможно.

Ответ 1

Предполагая, что наш столбец даты char или varchar, вы можете сделать что-то вроде этого

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

Или это

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

Если все, что вы хотите сделать, это отобразить текст по-другому, самый простой способ -

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

Или создайте представление и используйте его вместо исходной таблицы:

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

Но если вы используете фактические типы данных даты и времени, пользователи ваших данных получат их сопоставление с подходящими типами даты и времени в клиенте и затем могут выбрать, как наилучшим образом отображать их для своих нужд.

Другим преимуществом использования типов даты и времени является то, что они обеспечивают целостность данных. Подождите, пока кто-нибудь не добавит или не изменит дату, чтобы сделать ее недействительной — скажем, `20142331 '. Затем, когда вам нужно отобразить эти данные в форме с именем месяца ("22 января 2014 года, скажем), веселье будет иметь место, когда вы получите исключение, пытаясь сопоставить номер месяца с именем месяца.

Если вы не собираетесь использовать тип даты/времени, сохраните год, месяц и день индивидуально как целочисленные значения с подходящими контрольными ограничениями для обеспечения целостности:

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

Ответ 2

Самый простой способ - преобразовать строку в дату, а затем вернуться в нужном формате в инструкции обновления.

К сожалению, я не могу запустить какой-либо код в это время, поэтому любой пример кода, который я мог бы дать, вероятно, будет бесполезным, но, надеюсь, эти ссылки помогут вам. Может быть необходимо выполнить прямую манипуляцию строками, поскольку я замечаю, что в SQL Server 2008, похоже, отсутствует стиль преобразования "маска даты". http://msdn.microsoft.com/en-us/library/ms180878 (v = sql.100).aspx http://msdn.microsoft.com/en-us/library/ms187928.aspx

Обратите внимание, что это ТОЧНАЯ причина, по которой вы обычно храните дату как объект даты. Это довольно прямолинейно, чтобы создать строку вывода из даты в формате, который вы хотите, в выражении select, но более запутанным, чтобы сделать это, когда он хранится как необработанные символы.

Извините, этот ответ не лучше; мой основной опыт в Oracle, но, надеюсь, это поможет вам начать.