2013-12-25 2 views
0

У меня есть 3 столбца varchar(max) data-type; эти столбцы содержат даты (например, 03/12/2004 -> в этом формате).запрос для коррекции времени даты

  1. Этих столбцы содержат некоторые некорректные даты, т.е. 30/02/2004 -> проблемы с датами февральского месяца

    Я использовал этот запрос, который дает неверные даты, как 0 & действительным даты 1, но я не могу исправить эти даты после получение 0 & 1. Пожалуйста, дайте мне решение, как исправить это. 30/02/2003 к т.е. 01/03/2003

    SET DATEFORMAT dmy 
    SELECT Visit_Date, ISDATE(Visit_Date) as ValidDate 
    FROM TABLE_NAME 
    
  2. После исправления этих дат в 3 колонки, как преобразовать типы данных столбцов datetime типа? (помните, что запись в каждом столбце составляет 2,5 миллиона).

+0

Есть ли у вас какие-либо даты, как '03/15'2004'? Я уверен, что формат 'DD/MM/YYYY', в отличие от' MM/DD/YYYY'? Хорошо подходит для перехода к правильному типу даты/времени/времени. –

+0

Я уверен, что формат - это DD/MM/YYYY –

ответ

0

Если вы уверены, которые являются неправильными датами и каковы правильные даты вы можете сделать простой UPDATE так:

UPDATE TABLE_NAME 
SET Visit_Date = IIF(Visit_Date = '30/02/2003', '01/03/2003', Visit_Date) 

или в случае, если вы не используете SQL Server 2012 заявление выше выглядит как это:

UPDATE TABLE_NAME 
SET Visit_Date = CASE WHEN Visit_Date = '30/02/2003' THEN '01/03/2003' ELSE Visit_Date END 

EDIT:

Вы можете использовать FOLLO чтобы уточнить даты:

CREATE TABLE DataSource 
(
    [Date] VARCHAR(128) 
) 

INSERT INTO DataSource ([Date]) 
VALUES ('27/02/2003') 
     ,('28/02/2003') 
     ,('29/02/2003') 
     ,('30/02/2003') 
     ,('31/02/2003') 
     ,('32/02/2003') 
     ,('33/02/2003') 
     ,('34/02/2003') 
     ,('35/02/2003') 
     ,('36/02/2003') 

SELECT COALESCE(TRY_CONVERT(DATE,[Date]) 
       ,DATEADD(DAY 
       ,CAST(SUBSTRING([Date],0,3) AS INT) - 1 
       ,DATEADD(MONTH 
          ,(SUBSTRING([Date],7,4) - 1900) * 12 + SUBSTRING([Date],4,2) - 1 
          ,0) 
       ) 
     ) 
FROM DataSource 

В принципе, он создает новую дату, используя год и месяц с вашей строки даты. Для exmaple, если значение Date равно 29/02/2003, оно создаст новую дату '2003-02-01'. После этого он добавляет дни от значения Date к новой дате с использованием функции DATEADD и оставляет SQL Server для вычисления новой даты.

Выход из приведенного выше запроса:

enter image description here

и здесь полный рабочий example

+0

thnx 4 ур ответ .... вещь есть: в каждой колонке есть 2,5 миллиона записей (дат), 30/02/2003-> неправильная дата, я только что привел здесь для лучшего понимания ... во-вторых, я использую SQL Server 2008 –

+0

@usman_zufi Это полезно? Или ваша ситуация сложная, и вам нужна другая техника для использования? – gotqn

+0

Ваше решение как-то специфично. Я проверил большинство неправильных дат, у всех проблемы с февральским месяцем. Я хочу, чтобы, если есть 29 или 30, они все обновились до следующей правильной даты, сохранив год дата как есть ,,. –

Смежные вопросы