SQL Server DateTime l'échec de conversion

J'ai une grande table avec 1 million de+ enregistrements. Malheureusement, la personne qui a créé la table a décidé de mettre les dattes dans un varchar(50) champ.

J'ai besoin de faire une simple comparaison de dates -

datediff(dd, convert(datetime, lastUpdate, 100), getDate()) < 31

Mais il échoue sur la convert():

Conversion failed when converting datetime from character string.

Apparemment, il y a quelque chose dans ce domaine, il n'aime pas, et comme il ya tellement de nombreux dossiers, je ne peux pas dire tout simplement en le regardant. Comment apprendre à bien désinfecter l'ensemble du champ de date afin de ne pas échouer sur la convert()? Voici ce que j'ai maintenant:

select count(*)
from MyTable
where
    isdate(lastUpdate) > 0
    and datediff(dd, convert(datetime, lastUpdate, 100), getDate()) < 31

@SQLMenace

Je ne suis pas préoccupé par la performance dans ce cas. Cela va être un moment de la requête. Modification d'une table à un champ datetime n'est pas une option.

@Jon Limjap

J'ai essayé d'ajouter le troisième argument, et il ne fait aucune différence.


@SQLMenace

Le problème est probablement la façon dont les données sont stockées, il y a seulement deux sûre formats; ISO AAAAMMJJ; ISO 8601 aaaa-mm-jj Thh:mm:ss:mmm (sans les espaces)

Ne serait pas la isdate() vérification de prendre soin de cela?

Je n'ai pas besoin d'une précision de 100%. Je veux juste que la plupart des enregistrements à partir des 30 derniers jours.


@SQLMenace

select isdate('20080131') -- returns 1
select isdate('01312008') -- returns 0

@Brian Schkerke

Place le CAS et ISDATE à l'intérieur de la fonction CONVERT() fonction.

Merci! Qu'il a fait.

Vous n'avez pas mentionné ce que les formats les dates sont dans le champ de type varchar. Sont-elles régulièrement mises en forme? Sachant que le format de l'aider un peu avec la résolution du problème.

OriginalL'auteur Seibar | 2008-08-26