2010-06-17 14 views
6

Tengo una tabla de 300,000 filas; una de las columnas es varchar() pero realmente contiene una fecha xx/xx/xxxx o x/x/xxxx o similar. Sin embargo, la ejecución de la siguiente prueba produce un error:Encontrar fechas no válidas en SQL Server 2008

SELECT CAST(MyDate as Datetime) FROM MyTable 

El problema es que no me dice en qué fila ...

que han ejecutado una serie de cambios “manuales” por ensayo y error y realizado actualizaciones simples para arreglarlas, pero tiene que haber algunos valores extraños que necesitan ser eliminados o reparados.

Por ejemplo me lleva a cabo una prueba simple que fija unos 40 filas:

UPDATE MyTable SET MyDate = REPLACE(MyDate, '/000','/200') FROM MyTable WHERE MyDate like ('%/000%’) 
UPDATE MyTable SET MyDate = REPLACE(MyDate, '/190','/199') FROM MyTable WHERE MyDate like ('%/190%’) 

Esto fija un buen número de filas extraños que tenían como fechas 01/01/0003 y tal. (Las fechas oscilan entre 1998 y 2010).

Sin embargo, me gustaría saber que filas están fallando en la selección anterior.

¿Cuál sería la mejor manera de imprimirlos para poder eliminarlos, editarlos o ver qué hacer? Gracias.

Respuesta

19
SELECT 
    * 
FROM 
    MyTable 
WHERE 
    ISDATE(MyDate) = 0 
+0

Gracias, eso lo hizo. –

+0

Funciona bien en Access también - gracias. –

4

¿Has probado la función ISDATE?

+0

Me había olvidado de eso, pero funcionó. Gracias. –

0

Cuidado con IsDate. Tengo 1 mal registro en una tabla de miles. Dice que 8201-11-30 es una fecha válida. IsDate debe tener una limitación AÑO.

+0

8201-11-30 es una fecha válida desde que CONVERT (fecha, '8201-11-30') tiene éxito. También es lógicamente válido ... suponiendo que no modifiquemos cómo rastreamos la fecha en los próximos 6000 años. Un límite de un año sería específico de la aplicación ... una regla de validación. – steve

0

ISDATE no parece funcionar siempre.

las siguientes declaraciones de 1 en SQL Server 2008 R2 Select ISDATE('04- December 20')

Pero tratar de emitir el mismo valor hasta la fecha se producirá un error. Select cast('04- December 20' as date)

La conversión falló al convertir la fecha y/o hora de la cadena de caracteres.

Cuestiones relacionadas