Функция IsDate в SQL оценивает недопустимые даты как допустимые
Я запускаю инструкцию SQL для импортированных данных из файлов Excel. В этом SQL я проверяю, правильно ли пользователи ввели даты с помощью функции IsDate. Поскольку это необработанные данные, которые еще не были преобразованы, все даты хранятся в поле типа данных varchar.
в некоторых случаях IsDate возвращает 1 (допустимая дата), когда явно неверный формат даты, введенный пользователем.
Например:
07/001/2012
2012-07-002
007/002/2012
любые предложения о том, как чтобы справиться с этой проблемой?
SELECT *
FROM tblImport
WHERE (ISDATE(dt) = 0
AND (dt is not null AND dt <> ''))
спасибо!
p.s. Порка пользователей не помогла.
3 ответов
Я делаю много работы по преобразованию данных, и вот функция, которую я создал и использую ее практически каждый день, чтобы отсеять плохие даты:
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
результаты:
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
попробуйте установить dateformat
во - первых-это сработало для меня, когда я видел исключения.
set dateformat dmy
select IsDate(<column>)
from Table
может быть, просто проверить лен dt? однако, он не может обрабатывать случаи, когда лен действует. может быть, проверка ввода должна произойти во фронтенде?