2012-07-31 38 views
11

Estoy ejecutando una instrucción SQL contra datos importados de archivos de Excel. En este SQL estoy comprobando si los usuarios han ingresado las fechas correctamente utilizando la función IsDate. Dado que se trata de datos sin procesar que aún no se han convertido, todas las fechas se almacenan en un campo de tipo de datos varchar.La función IsDate en SQL evalúa las fechas inválidas como válidas

En algunas circunstancias IsDate devuelve 1 (fecha válida) cuando claramente hay un formato de fecha incorrecto introducido por el usuario.

Por ejemplo:

07/001/2012 

2012-07-002 

007/002/2012 

alguna sugerencia sobre cómo manejar este problema?

SELECT * 
    FROM tblImport 
WHERE (ISDATE(dt) = 0 
     AND (dt is not null AND dt <> '')) 

¡Gracias!

p.s. Los usuarios de Smacking no ayudaron.

+0

No C#. Vista SQL, que devuelve registros con fechas no válidas. – ssokol91

Respuesta

21

hago mucho trabajo de conversión de datos y aquí es una función que he creado y lo uso casi todos los días para eliminar las malas citas:

CREATE FUNCTION dbo.fnCheckDate 
(@InDate nvarchar(50)) 
RETURNS DATETIME 
AS 
    BEGIN 
     declare @Return DATETIME 

     select @return = CASE WHEN ISDATE(@InDate) = 1 
          THEN CASE WHEN CAST(@InDate as DATETIME) BETWEEN '1/1/1901 12:00:00 AM' AND '6/6/2079 12:00:00 AM' 
            THEN @InDate 
            ELSE null 
            END 
          ELSE null 
          END 
     return @return 
    END 
GO 

de resultados: Marco

SELECT dbo.fnCheckDate('07/001/2012') --> Returns 2012-07-01 00:00:00.000 
SELECT dbo.fnCheckDate('2012-07-002') --> Returns 2012-07-01 00:00:00.000 
SELECT dbo.fnCheckDate('007/002/2012') --> Returns 2012-07-01 00:00:00.000 
SELECT dbo.fnCheckDate('00/002/2012') --> Returns Null 
SELECT dbo.fnCheckDate('006/031/2012') --> Returns Null 
SELECT dbo.fnCheckDate('') --> Returns Null 
+1

Esto es genial! Gracias! – ssokol91

+2

+1 pero ¿por qué terminas a 1/2/2030 con SQL smalldatetime goes 2079-06-06 – Paparazzi

+1

Porque para 2030 estaré muerto y enterrado hace mucho tiempo (jaja)! Todos los datos con los que trato son históricos, así que realmente no tengo que preocuparme por las fechas futuras, pero es un buen punto. –

1

tal vez solo revise dt's LEN? sin embargo, no puede manejar casos cuando el len es válido. tal vez la validación de entrada debería ocurrir en la interfaz?

+0

La validación de entrada fue mi primera línea de defensa. Desafortunadamente, dado que toda la entrada de datos se realiza en archivos de Excel, y todos sabemos cuán descuidados pueden ser los usuarios, fue simplemente imposible. – ssokol91

6

Try el dateformat primero - eso funcionó para mí cuando estaba viendo excepciones.

set dateformat dmy 
select IsDate(<column>) 
from Table 
Cuestiones relacionadas