2012-07-31 41 views
11

Tôi đang chạy một câu lệnh SQL chống lại dữ liệu đã nhập từ tệp Excel. Trong SQL này, tôi kiểm tra xem người dùng đã nhập ngày tháng đúng chưa bằng cách sử dụng hàm IsDate. Vì đây là dữ liệu thô chưa được chuyển đổi, tất cả các ngày được lưu trữ trong trường loại dữ liệu varchar.Hàm IsDate trong SQL đánh giá các ngày không hợp lệ là hợp lệ

Trong một số trường hợp, IsDate trả về 1 (ngày hợp lệ) khi có định dạng ngày không chính xác được người dùng nhập.

Ví dụ:

07/001/2012 

2012-07-002 

007/002/2012 

Bất kỳ Gợi ý về làm thế nào để xử lý vấn đề này?

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

Cảm ơn!

p.s. Smacking người dùng 'đã không giúp đỡ.

+0

Không C#. SQL View, trả về các bản ghi có ngày không hợp lệ. – ssokol91

Trả lời

21

tôi làm rất nhiều công việc chuyển đổi dữ liệu và đây là một chức năng mà tôi tạo ra và sử dụng nó hầu như hàng ngày để loại bỏ những ngày xấu:

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 

Kết quả: Thiết lập

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

Điều này thật tuyệt! Cảm ơn! – ssokol91

+2

+1 nhưng tại sao bạn kết thúc vào 1/2/2030 với SQL smalldatetime đi 2079-06-06 – Paparazzi

+1

Bởi vì vào năm 2030, tôi sẽ chết và chôn cất (LOL)! Tất cả dữ liệu tôi xử lý là lịch sử nên tôi thực sự không phải lo lắng về những ngày trong tương lai nhưng là điểm tuyệt vời. –

1

có thể chỉ cần kiểm tra LEN's LEN? tuy nhiên, nó không thể xử lý các trường hợp khi len hợp lệ. có lẽ xác nhận đầu vào sẽ xảy ra trong giao diện người dùng?

+0

Xác thực đầu vào là tuyến phòng thủ đầu tiên của tôi. Thật không may, vì tất cả các mục nhập dữ liệu được thực hiện trong các tệp Excel, và tất cả chúng ta đều biết người dùng bất cẩn có thể như thế nào, nó đơn giản là không thể. – ssokol91

6

Thử dateformat trước tiên - đã hoạt động cho tôi khi tôi nhìn thấy ngoại lệ.

set dateformat dmy 
select IsDate(<column>) 
from Table 
Các vấn đề liên quan