Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Khắc phục Msg 241 “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ự” trong SQL Server

Nếu bạn gặp lỗi SQL Server Msg 241 có nội dung Chuyển đổi không thành công khi chuyển đổi ngày và / hoặc giờ từ chuỗi ký tự , có thể là do bạn đang cố chuyển đổi một chuỗi thành giá trị ngày / giờ, nhưng chuỗi cụ thể đó không thể chuyển đổi thành giá trị ngày / giờ.

Ví dụ về Lỗi

Dưới đây là một ví dụ về mã tạo ra lỗi:

 SELECT CAST('Tomorrow' AS date); 

Kết quả:

 Msg 241, Mức 16, Trạng thái 1, Dòng 1 Chuyển đổi không thành công khi chuyển đổi ngày và / hoặc giờ từ chuỗi ký tự. 

Tại đây, chúng tôi đã cố gắng chuyển đổi chuỗi Tomorrow đến ngày date nhập, nhưng Tomorrow không phải là ngày hợp lệ có thể được chuyển đổi thành date loại.

Máy chủ SQL không thể chuyển đổi chuỗi thành date và do đó, nó trả về một lỗi.

Giải pháp 1

Cách rõ ràng nhất để khắc phục điều này là thay đổi chuỗi để giống với một ngày thực tế.

Nếu bạn đang chuyển một cột, hãy kiểm tra xem bạn đã chọn đúng cột chưa. Tương tự nếu bạn đang chuyển một biến - hãy kiểm tra xem đó có phải là biến phù hợp hay không.

Ví dụ:chuyển đổi sau thành công:

 SELECT CAST('20 Feb 2030' AS date); 

Kết quả:

 2030-02-20 

Tùy thuộc vào định dạng của ngày nhập, bạn nên sử dụng CONVERT() để bạn có thể chỉ định định dạng của biểu thức ngày đầu vào.

Ví dụ:

 SELECT 
    CONVERT(date, '03/02/2030', 101) AS 'US with century',
    CONVERT(date, '03/02/30', 1) AS 'US without century',
    CONVERT(date, '03/02/2030', 103) AS 'British with century',
    CONVERT(date, '03/02/30', 3) AS 'US without century'; 

Kết quả:

 + ------------------- + ---------------------- + --- --------------------- + ---------------------- + | Mỹ với thế kỷ | Mỹ không có thế kỷ | Người Anh với thế kỷ | Mỹ không có thế kỷ || ------------------- + ---------------------- + - ---------------------- + ---------------------- || 2030-03-02 | 2030-03-02 | 2030-02-03 | 2030-02-03 | + ------------------- + ---------------------- + ------------------------ + ---------------------- +  

Giải pháp 2

Một cách khác để xử lý lỗi là sử dụng TRY_CAST() hoặc TRY_CONVERT() . Các hàm này trả về NULL thay vì lỗi.

Ví dụ:

 SELECT TRY_CAST('Tomorrow' AS date); 

Kết quả:

 NULL 

Tuy nhiên, điều này không nhất thiết phải giải quyết vấn đề cơ bản mà nó chỉ ẩn nó đi. Chuyển đổi vẫn không thể diễn ra.

Trong mọi trường hợp, nó vẫn có thể là một lựa chọn khả thi, tùy thuộc vào nhu cầu của bạn.

Giải pháp 3

Một cách khác để xử lý lỗi là chuyển đổi chuỗi thành một kiểu dữ liệu khác. Rõ ràng, điều này là không tốt nếu bạn muốn kết thúc bằng date nhập, nhưng có lẽ lỗi xảy ra do bạn đã vô tình chỉ định date nhập thay vì loại khác.

Ví dụ:

 SELECT CAST('Wednesday' AS char(3)); 

Kết quả:

 Thứ tư 

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mã hóa sao lưu cơ sở dữ liệu SQL Server

  2. Có thể chỉ định điều kiện trong Count () không?

  3. Cách ngăn chặn tấn công SQL Injection bằng cách bảo mật

  4. Điền các ngày còn thiếu theo nhóm

  5. EF 6 - Cách thực hiện chính xác các truy vấn song song