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

TO_DATE yy, yyyy cho tôi những kết quả khác nhau

Bởi vì bạn đang thực hiện một chuyển đổi rõ ràng không cần thiết từ chuỗi đến ngày, điều này đang thực hiện ẩn chuyển đổi từ ngày thành chuỗi dựa trên cài đặt NLS của bạn.

Những gì bạn nên làm chỉ là:

select to_char(sysdate - 7, 'year') from dual;

TO_CHAR(SYSDATE-7,'YEAR')                 
------------------------------------------
twenty seventeen

Bởi vì sysdate-7 đã là một ngày, bạn không nên gọi to_date() xung quanh đó, với bất kỳ định dạng nào. Dưới dạng to_date() hàm nhận đối số chuỗi, sysdate-7 của bạn trước tiên biểu thức phải được chuyển đổi hoàn toàn thành một chuỗi. Vì vậy, bạn thực sự đang làm:

select to_char(to_date(to_char(sysdate - 7), 'DD/MM/YYYY'), 'year') from dual;

đang sử dụng giá trị NLS_DATE_FORMAT của bạn cho to_char() ngầm bên trong gọi, vì vậy nếu đó là 'DD-MON-RR' bạn thực sự đang làm:

select to_char(to_date(to_char(sysdate - 7, 'DD-MON-RR'), 'DD/MM/YYYY'), 'year') from dual;

Để xem những gì đang diễn ra ở đó, bạn cần xem ngày được tạo đầy đủ là bao nhiêu, vì vậy tôi sẽ thay đổi NLS_DATE_FORMAT cho phiên hiển thị cả năm:

alter session set nls_date_format = 'SYYYY-MM-DD';

select sysdate - 7 as raw_date,
  to_char(sysdate - 7, 'DD-MON-RR') as implicit_string,
  to_date(to_char(sysdate - 7, 'DD-MON-RR'), 'DD/MM/YY') as implcit_yy,
  to_date(to_char(sysdate - 7, 'DD-MON-RR'), 'DD/MM/YYYY') as implcit_yyyy
from dual;

RAW_DATE    IMPLICIT_STRING    IMPLCIT_YY  IMPLCIT_YYY
----------- ------------------ ----------- -----------
 2017-04-30 30-APR-17           2017-04-30  0017-04-30

Lưu ý các năm khác nhau trong hai giá trị cuối cùng. Tài liệu có phần về đối sánh mô hình định dạng . Chuỗi bạn đang tạo ngầm ở giữa có năm gồm 2 chữ số. Khi bạn chuyển đổi chuỗi '30-APR-17' quay lại một ngày bằng YY mô hình, nó 'hữu ích' giả định là thế kỷ hiện tại, vì vậy ngày kết thúc là năm 2017. Nhưng khi bạn chuyển đổi cùng một chuỗi bằng cách sử dụng YYYY mô hình nó nghĩ rằng bạn thực sự có nghĩa là giá trị bạn đã vượt qua và vì vậy không giả định một thế kỷ - và bạn đã vượt qua nó 17, vì vậy bạn kết thúc với năm 17; đó là 0017 chứ không phải năm 2017. (Bạn cũng sẽ có câu trả lời như mong đợi bằng cách sử dụng RRRR , nhưng tốt hơn hết là bạn nên tuân theo YYYY và thực sự sử dụng năm 4 chữ số ở mọi nơi - nếu bạn thực sự cần sử dụng một chuỗi.)

Về cơ bản:không dựa vào cài đặt NLS hoặc chuyển đổi ngầm định ngày thành chuỗi hoặc ngược lại.

Trong trường hợp này, bạn không cần bất kỳ chuyển đổi, vì vậy hãy sử dụng câu lệnh đơn giản hơn ở đầu câu trả lời này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để định dạng và sắp xếp một ngày trong Oracle?

  2. Oracle SQL Insert Trigger to Hash Password không hoạt động (Sự cố với CHAR)

  3. 2 chức năng để có được năm từ một ngày trong Oracle

  4. Nguyên nhân gây ra lỗi ORA-38104 trên SQL merge là gì?

  5. Làm thế nào để thay đổi giá trị âm thành dương trong Oracle?