2013-03-09 52 views
7

tôi có một loạt các ngày trong varchar như thế này:Chuyển đổi YYYYMMDD để NGÀY

20080107 
20090101 
20100405 
... 

Làm thế nào để chuyển đổi chúng sang định dạng ngày như thế này:

2008-01-07 
2009-01-01 
2010-04-05 

Tôi đã cố gắng sử dụng này :

SELECT [FIRST_NAME] 
     ,[MIDDLE_NAME] 
     ,[LAST_NAME]  
     ,cast([GRADUATION_DATE] as date)  
    FROM mydb 

Nhưng nhận được tin nhắn này:

Msg 241, Cấp 16, Tiểu bang 1, Dòng 2
Chuyển đổi không thành công khi chuyển đổi ngày và/hoặc thời gian từ chuỗi ký tự.

+0

Hmmm .. một littleconfused đây. Chuyển đổi đó có được xử lý tự động không? – Coffee

+0

thử SELECT CONVERT (DATETIME, '20080107') – pavanred

+0

@Aaron Bertrand - Tôi thấy quan điểm của bạn. –

Trả lời

16

Lỗi xảy ra vì bạn (hoặc bất kỳ ai thiết kế bảng này) have a bunch of dates in VARCHAR. Tại sao bạn (hoặc bất kỳ ai thiết kế bảng này) lưu trữ ngày tháng dưới dạng chuỗi? Bạn (hoặc bất cứ ai thiết kế bảng này) cũng lưu trữ tiền lương và giá cả và khoảng cách như dây?

Để tìm các giá trị đang gây ra vấn đề (vì vậy bạn (hoặc bất cứ ai thiết kế bảng này) có thể giải quyết chúng):

SELECT GRADUATION_DATE FROM mydb 
    WHERE ISDATE(GRADUATION_DATE) = 0; 

Bet bạn có ít nhất một hàng. Sửa các giá trị đó, sau đó sửa BẢNG. Hoặc hỏi bất cứ ai thiết kế bảng để FIX THE TABLE. Thực sự độc đáo.

ALTER TABLE mydb ALTER COLUMN GRADUATION_DATE DATE; 

Bây giờ bạn không cần phải lo lắng về các định dạng - bạn luôn có thể định dạng như YYYYMMDD hay YYYY-MM-DD trên máy khách, hoặc sử dụng CONVERT trong SQL. Khi bạn có một ngày giá trị như một chuỗi chữ, bạn có thể sử dụng:

SELECT CONVERT(CHAR(10), '20120101', 120); 

... nhưng điều này được thực hiện tốt hơn trên máy khách (nếu có).

Có thuật ngữ phổ biến - rác trong, đổ rác. Bạn sẽ không bao giờ chuyển đổi thành một ngày (không bao giờ chuyển đổi thành một chuỗi ở định dạng cụ thể) nếu lựa chọn loại dữ liệu của bạn (hoặc kiểu dữ liệu được chọn cho bất kỳ ai thiết kế bảng) vốn đã cho phép rác vào bảng của bạn . Hãy sửa chữa nó. Hoặc hỏi bất cứ ai thiết kế bảng (một lần nữa, thực sự độc đáo) để sửa chữa nó.

+0

Bạn đã chính xác, có một số giá trị bị thiếu mà tôi không thấy ở giữa bảng. Cảm ơn bạn đã nhắc tôi về hàm 'isdate()'. – screechOwl

+6

Tôi thấy điều này tất cả thời gian với dữ liệu máy tính lớn. Db2 cho iSeries/AS400. Bài đăng này là một loại rant cho rằng người dùng có quyền kiểm soát đối phó với ngày tháng dưới dạng chuỗi. Quá nhiều rant, không đủ câu trả lời. – smoore4

+1

@SQLDBA Tôi phải bỏ lỡ nơi OP - hai năm trước đã chấp nhận câu trả lời này - nói rằng họ đang sử dụng dữ liệu máy tính lớn mà họ không thể thay đổi. Nếu đó là dữ liệu máy tính lớn mà họ không thể thay đổi, câu trả lời của bạn về cách giải quyết vấn đề đó ở đâu? Nếu máy tính lớn đã lưu trữ '20130232', bạn có thể cung cấp thêm câu trả lời, ít hơn không? –

6

Sử dụng SELECT CONVERT(date, '20140327')

Trong trường hợp của bạn,

SELECT [FIRST_NAME], 
     [MIDDLE_NAME], 
     [LAST_NAME], 
     CONVERT(date, [GRADUATION_DATE])  
FROM mydb 
-1

Trong trường hợp của bạn nên là:

Select convert(datetime,convert(varchar(10),GRADUATION_DATE,120)) as 
'GRADUATION_DATE' from mydb 
+0

Thanx nó đã làm việc cho tôi trong Ms SQl 2005 –

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