Cách khắc phục & lsquo; Chuyển đổi Không thành công khi Chuyển đổi Ngày và / hoặc Giờ từ Chuỗi ký tự & rsquo; Lỗi?

Có nhiều trường hợp ngày và giờ không xuất hiện ở định dạng bạn muốn, cũng như kết quả truy vấn không phù hợp với nhu cầu của người xem. Có một số tính năng tích hợp của SQL Server để định dạng chuỗi ngày theo nhu cầu của bạn nhưng để SQL Server diễn giải chuỗi và để tránh lỗi chuyển đổi, nó phải có định dạng phù hợp. Khi chúng tôi cố gắng chuyển đổi ngày hoặc giờ từ chuỗi ký tự, đôi khi lỗi phát sinh. “Chuyển đổi không thành công khi chuyển đổi ngày và / hoặc giờ từ chuỗi ký tự.”

lỗi chuyển đổi ngày giờ

Lỗi được đề cập ở trên thường phát sinh khi ký tự ngày không phù hợp và không thể chuyển đổi từ chuỗi thành DateTime hoặc ngày. Lỗi này là do một số nguyên nhân, mà chúng tôi sẽ thảo luận chi tiết cùng với bộ giải pháp.

Ví dụ 1:

Vương quốc Anh Ký hiệu ngày và giờ hiển thị ngày bằng định dạng ngày-tháng-năm (ngày 10 tháng 1 năm 2015 hoặc ngày 10 tháng 1 năm 2015) mà chúng ta có thể đạt được bằng cách sử dụng chức năng "convert" tính năng "convert" của SQL Server với kiểu định dạng 103.

Ở đây trong ví dụ bên dưới, chúng ta có thể thấy rằng chuỗi ngày được cung cấp có định dạng sai. Đầu tiên, nó cung cấp tháng, sau đó là ngày và cuối năm bị sai và SQL Server không thể giải thích được, dẫn đến lỗi. Định dạng chính xác cho chuyển đổi ngày kiểu Vương quốc Anh sử dụng kiểu ngày “103” là “dd / mm / yyyy”.

Sai định dạng:

Khai báo @date_time_value varchar (100) = '10/16/2015 21:02:04' chọn CONVERT (datetime2, @date_time_value, 103) là UK_Date_Time_Style

Định dạng đúng:

Định dạng ngày của Anh và Pháp là 103 = “dd / mm / yyyy” hoặc 3 = ”dd / mm / yy”. Ở đây 103 và 3 là kiểu ngày tháng.

Khai báo @date_time_value varchar (100) = '10/1/15 21:02:04' chọn CONVERT (datetime2, @date_time_value, 103) là Date_Time_Style
Khai báo @date_time_value varchar (100) = '10/1/15 21:02:04 'chọn CONVERT (datetime2, @date_time_value, 3) là UK_Date_Time_Style

Ví dụ 2:

Đôi khi chuyển đổi chuỗi thành ngày tháng trong máy chủ SQL dẫn đến lỗi, không phải do định dạng ngày hoặc giờ được sử dụng, mà là do bạn đang cố gắng lưu trữ thông tin không chính xác không được chấp nhận đối với lược đồ.

Nhầm cuộc hẹn:

Lý do cho lỗi sau đây chỉ là trong năm 2019 không có ngày như là "29 tháng 2" vì nó không phải là năm nhuận.

Khai báo @date_time_value varchar (100) = '2019-02-29 21:02:04' chọn truyền (@date_time_value là datetime2) là date_time_value

Một đúng:

Khai báo @date_time_value varchar (100) = '2019-02-28 21:02:04' chọn truyền (@date_time_value là datetime2) là date_time_value

Định dạng ngày ISO 8601:

Mặc dù nhiều định dạng có sẵn để thao tác các giá trị ngày tháng, nhưng khi làm việc cho khối lượng toàn cầu / quốc tế, việc chọn biểu diễn ngày giờ có thể là một vấn đề về khả năng sử dụng. Vì vậy, nên tránh các ký tự ngày / giờ dành riêng cho văn hóa. Nếu chúng ta coi ngày này là “03/08/2018”, nó sẽ được hiểu theo những cách khác nhau ở các khu vực khác nhau trên thế giới.

  • Theo phong cách Vương quốc Anh, nó được hiểu là “ngày 8 tháng 3 năm 2018”
  • Theo phong cách Châu Âu, nó được hiểu là “ngày 3 tháng 8 năm 2018”

May mắn thay, có một thay thế trong định dạng ngày quốc tế do ISO phát triển. Định dạng ISO 8601 tiêu chuẩn toàn cầu “YYYY-MM-DDThh: mm: ss” là một tùy chọn độc lập với ngôn ngữ hơn cho các ký tự chuỗi và nó giải quyết tất cả các vấn đề này. Trong khi, “yyyy” là năm, “mm” là tháng và “dd” là ngày. Vì vậy, ngày “8 tháng 3 năm 2018” ở định dạng ISO quốc tế được viết là “2018-03-08”. Do đó, định dạng ISO là sự lựa chọn tốt nhất để biểu diễn ngày tháng.

Khai báo @date_time_value varchar (100) = '2019-03-28 21:02:04' select convert (datetime2, @ date_time_value, 126) as [yyyy-mm-ddThh: mi: ss.mmm]

Khuyến nghị:

Hy vọng rằng, bài viết này sẽ giúp giải tỏa sự nhầm lẫn mà tôi thường thấy trong cộng đồng về các giá trị ngày / giờ. Tuy nhiên, không bao giờ lưu trữ ngày tháng ở kiểu văn bản (varchar, char, nvarchar, nchar, hoặc văn bản) Luôn lưu trữ giá trị ngày tháng ở dạng DATE, DATETIME và tốt nhất là các cột loại DATETIME2 (cung cấp độ chính xác hơn) và để nguyên định dạng thông tin ngày tháng đến lớp giao diện người dùng thay vì được truy xuất từ ​​cơ sở dữ liệu.