2009-06-04 1 views
2

У меня есть устаревшая база данных SQL Server 2000, у которой есть один столбец с датой, которая хранится как varchar вместо даты и времени по любой причине. Я хочу сделать представление против этих данных и использовать поле datetime вместо varchar, чтобы упростить создание отчета в поле. Хорошей новостью является то, что значения значений выглядят так, как будто они должны быть приведены непосредственно в дату и время.Могу ли я получить список строк с значениями varchar, которые не могут быть использованы для datetime?

Конечно, по-видимому, есть поля, которые были введены таким образом, что они не могут быть использованы для datetime. Просто для ясности, вот как таблица может выглядеть:

CREATE TABLE dbo.user 
(
    ... 
    birthdate varchar(10) 
    ... 
) 

И взгляд может выглядеть следующим образом:

CREATE VIEW dbo.UserView 
AS 
SELECT ... 
     CAST(u.birthdate AS datetime) AS birthdate 
     ... 
FROM user u 
WHERE ... 

Есть ли способ, я могу:

  1. Получить список всех строк, в которых дата рождения не может быть перенесена в дату и время, если я смогу ее восстановить?
  2. В тех случаях, когда я не могу восстановить значение, сделайте значение отображаемым как NULL или, возможно, даже что-то, что, очевидно, не фактическая дата рождения пользователя?

ответ

5

Используйте IsDate()

SELECT birthdate, ' ' _, * 
FROM user u 
WHERE IsDate(u.bithdate) != 1 

и

SELECT ... 
    CAST(CASE WHEN IsDate(u.birthdate) = 1 THEN u.birthdate ELSE NULL END AS datetime) AS birthdate 
    ... 
FROM user u 
WHERE ... 
2

показать плохие строки:

select * from dbo.user where isdate(birthdate)!=1 

Ваш вид:

SELECT ... 
    CASE 
     WHEN isdate(birthdate)=1 THEN CAST(u.birthdate AS datetime) 
     ELSE NULL 
    END AS Birthday 
     ... 
FROM user u 
WHERE ... 
+0

Это небольшая вещь, но хорошая точка на! = 1, а не = 0. В то время как эта конкретная функция всегда возвращает 1 или 0, многие функции возвращают NULL для NULL-входов, и это хорошая привычка быть в специально проверке на результат успеха. –

+0

+1 за избиение меня до запроса И для комментария Джоэла. –

+0

@Joel Coehoorn: NULL = 0 тоже не так, поэтому неважно – wqw

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