Làm thế nào để khắc phục lỗi '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ự'?



Hãy Thử Công Cụ CủA Chúng Tôi Để LoạI Bỏ Các VấN Đề

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ư đầu ra 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 hiểu được 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ờ

Hình 1: Lỗi chuyển đổi ngày và / hoặc thời gian từ chuỗi ký tự



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, 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

Hình 2: Định dạng ngày sai dẫn đến lỗi



Đị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

Hình 3: Định dạng ngày đúng với kiểu ngày “dd / mm / yyyy” của Anh / Pháp

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

Hình 4: Định dạng ngày đúng với kiểu ngày “dd / mm / yy” của Anh / Pháp

Ví dụ 2:

Đôi khi việc 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 thể chấp nhận được đối với lược đồ.

Nhầm cuộc hẹn:

Lý do cho sai sót sau chỉ là trong năm 2019 không có ngày nào 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

Hình 5: Lỗi được nêu ra vì năm 2019 không phải là năm nhuận, vì vậy nó không có ngày 29 tháng 2 là ngày

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

Hình 6: Ngày chính xác

Đị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ề tính khả 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]

Hình 7: Định dạng ngày tiêu chuẩn quốc tế ISO 8601

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, bạn không nên lưu trữ ngày tháng ở kiểu văn bản (varchar, char, nvarchar, nchar hoặc text) 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 đến lớp giao diện người dùng thay vì được truy xuất từ ​​cơ sở dữ liệu.

2 phút đọc