2009-06-04 7 views
2

J'ai une base de données SQL Server 2000 héritée qui a une colonne qui a une date qui est stockée comme un 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 faciliter la création d'un rapport sur le terrain. Les bonnes nouvelles sont que plus de des valeurs semblent comme ils devraient être capables d'être castés directement dans un datetime.Puis-je obtenir une liste de lignes avec des valeurs varchar qui ne peuvent pas être converties en datetime?

Bien entendu, certains champs ont été saisis de telle sorte qu'ils ne peuvent pas être convertis en date et heure. 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. Obtenez un liste de toutes les lignes où birthdate ne peut pas être jeté dans un datetime au cas où je peux le réparer?
  2. Dans les cas où je ne peux pas réparer la valeur, faire apparaître la valeur comme NULL ou peut-être même quelque chose qui est évidemment pas réelle date de naissance de l'utilisateur?

Répondre

5

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 ... 
2

montrent de mauvaises lignes:

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

votre vue:

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

C'est une petite chose, mais bon point sur = 1 plutôt que = 0. Alors que cette fonction particulière renvoie toujours 1 ou 0, de nombreuses fonctions renverront la valeur NULL pour les entrées NULL, et c'est une bonne habitude d'effectuer un test spécifique sur le résultat du succès. –

+0

+1 pour me battre à la requête ET pour le commentaire de Joel. –

+0

@Joel Coehoorn: NULL = 0 n'est pas vrai aussi, donc ce n'est pas grave – wqw

Questions connexes