2013-05-03 56 views
8

Tôi đang sử dụng SQL Server 2012Kiểm tra xem giá trị có phải là ngày và chuyển đổi nó

Tôi nhận dữ liệu ở một định dạng nhất định. Ngày là số (8.0)
Ví dụ 20120101 = YYYYMMDD

Tồn tại hàng với giá trị như (0,1,2,3,6) ở chỗ trường dữ liệu, do đó không phải là một ngày.

Tôi muốn kiểm tra xem đó có phải là ngày và chuyển đổi hay không, nếu không nó có thể là rỗng.

Bây giờ mã sau hoạt động, nhưng tôi đã hy vọng có một cách tốt hơn.

(CASE WHEN [invoice_date] LIKE '________' --There are 8 underscores 
THEN convert(datetime, cast([invoice_date] as char(8))) 
END) AS Invoice_Date 

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

18

sử dụng chức năng IsDate như ..

(CASE WHEN ISDATE (invoice_date) = 1 
      THEN convert(datetime, cast([invoice_date] as char(8))) 
      END) AS Invoice_Date 
3

Bạn có thể sử dụng hàm ISDATE, nhưng điều gì sẽ làm cho các giá trị không phải ngày? Trong giải pháp đề nghị của tôi, bạn có thể chọn để trả về null:

select 
    (case 
     when ISDATE (invoice_date)=1 
     then convert(datetime, invoice_date) 
    else null end) AS Invoice_Date 
from your_table 
0

Bạn có thể đi với TRYCATCH

DECLARE @Source    char(8) 
DECLARE @Destination  datetime 

set @Source='07152009' 
BEGIN TRY 
    SET @Destination=CONVERT(datetime,RIGHT(@Source,4)  -- YYYY 
             +LEFT(@Source,2)  -- MM 
             +SUBSTRING(@Source,3,2) -- DD 
          ) 
END TRY 
BEGIN CATCH 
    PRINT 'ERROR!!!' 
END CATCH 

SELECT @Source AS Source, @Destination AS Destination 
2

IsDate

Trả về 1 nếu biểu thức là ngày, giờ hoặc giá trị ngày giờ hợp lệ; nếu không, 0. ISDATE trả về 0 nếu biểu thức là giá trị datetime2.

Please visit

Các vấn đề liên quan