Làm thế nào để phân tích cú pháp chuỗi thành ngày tháng?


85

Làm cách nào để chuyển đổi Chuỗi thành Ngày trong T-SQL?

Trường hợp thử nghiệm của tôi là chuỗi: '24.04.2012'

Câu trả lời:




21

Giả sử rằng cơ sở dữ liệu là MS SQL Server 2012 trở lên, đây là một giải pháp hoạt động. Câu lệnh cơ bản chứa try-parse trong dòng:

SELECT TRY_PARSE('02/04/2016 10:52:00' AS datetime USING 'en-US') AS Result;

Đây là những gì chúng tôi đã triển khai trong phiên bản sản xuất:

UPDATE dbo.StagingInputReview
 SET ReviewedOn = 
     ISNULL(TRY_PARSE(RTrim(LTrim(ReviewedOnText)) AS datetime USING 'en-US'), getdate()),
 ModifiedOn = (getdate()), ModifiedBy = (suser_sname())
 -- Check for empty/null/'NULL' text
 WHERE not ReviewedOnText is null 
   AND RTrim(LTrim(ReviewedOnText))<>''
   AND Replace(RTrim(LTrim(ReviewedOnText)),'''','') <> 'NULL';

Các cột ModifiedOn và ModifiedBy chỉ dành cho mục đích theo dõi cơ sở dữ liệu nội bộ.

Xem thêm các tham chiếu MSDN của Microsoft này:


Điều này giả định rằng OP đang sử dụng Sql Server 2012+
Mark Kram

8

Mặc dù điều CONVERT hoạt động, nhưng bạn thực sự không nên sử dụng nó. Bạn nên tự hỏi tại sao bạn lại phân tích cú pháp các giá trị chuỗi trong SQL-Server. Nếu đây là công việc một lần mà bạn đang sửa một số dữ liệu theo cách thủ công, bạn sẽ không nhận được dữ liệu đó vào lần khác, điều này không sao cả, nhưng nếu bất kỳ ứng dụng nào đang sử dụng điều này, bạn nên thay đổi một số thứ. Cách tốt nhất là sử dụng kiểu dữ liệu "ngày tháng". Nếu đây là đầu vào của người dùng, điều này thậm chí còn tồi tệ hơn. Sau đó, trước tiên bạn nên thực hiện một số kiểm tra trong ứng dụng khách. Nếu bạn thực sự muốn chuyển các giá trị chuỗi mà SQL-Server mong đợi một ngày, bạn luôn có thể sử dụng định dạng ISO ('YYYYMMDD') và nó sẽ tự động chuyển đổi.


5
Còn về trường hợp bạn đang nhập tệp dữ liệu từ một số hệ thống bên ngoài và cột đầu vào xảy ra ở một trong các định dạng này, ví dụ: "05/31/2013", nhưng lại có dạng chuỗi? Và bạn đang viết, giả sử, một thủ tục được lưu trữ để nhập dữ liệu đó hay sử dụng SSIS để nhập dữ liệu đó? Sau đó, CONVERT sẽ là thứ thích hợp để sử dụng, phải không?
David Barrows

Không nhất thiết, trong các tình huống MS SQL Server lưu trữ các mô hình dữ liệu phân tích, trái ngược với các mô hình giao dịch, bạn hoàn toàn có thể sử dụng CONVERT vì nó phải xử lý nhiều nguồn bên ngoài sẽ không dễ dàng xuất hiện dưới dạng ngày tháng. (như David Barrows đã ám chỉ ở trên).
Will

Định dạng ký tự chuỗi mặc định cho ngày là YYYY-MM-DD
YB


1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

sẽ làm những gì cần thiết, kết quả:

2012-04-24 00:00:00.000

Điều đó dường như không hoạt động với những gì OP đã đăng ngay cả đối với các cài đặt ngôn ngữ khác nhau. Thử nó. Nếu nó thực sự hiệu quả với bạn, thì hãy đăng cài đặt ngôn ngữ hiện tại của bạn là gì. Cảm ơn. Đây là mã để thử ... CHỌN CHUYỂN ĐỔI (DateTime, '24 .04.2012 ', 121) AS ExpireDate
Jeff Moden
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.