Question

J'ai une base de données SQL Server héritage 2000 qui a une colonne qui a une date qui est stockée en tant que varchar au lieu d'un datetime pour une raison quelconque. Je veux faire une vue sur ces données et utiliser un champ datetime au lieu d'un varchar pour faire faire un rapport sur le terrain plus facile. Les bonnes nouvelles sont que plus des valeurs regarder comme ils devraient pouvoir être jeté directement dans un datetime.

Bien sûr, il y a apparemment quelques champs qui ont été saisis de telle sorte qu'ils ne sont pas castées datetime. Juste pour des raisons de clarté, voici comment la table pourrait ressembler:

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

Et la vue pourrait ressembler à ceci:

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

Est-il possible que je peux:

  1. Obtenir une liste de toutes les lignes où la date de naissance ne peut pas être jeté dans un datetime au cas où je peux le réparer?
  2. Dans le cas où je ne peux pas réparer la valeur, augmentez la valeur apparaissent comme NULL ou peut-être même quelque chose qui est évidemment pas date de naissance réelle de l'utilisateur?
Était-ce utile?

La solution

Utilisez IsDate ()

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

et

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

Autres conseils

montrer les mauvaises lignes:

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

votre point de vue:

SELECT ...
    CASE
        WHEN isdate(birthdate)=1 THEN CAST(u.birthdate AS datetime)
        ELSE NULL
    END AS Birthday
       ...
FROM user u
WHERE ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top