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

Làm cách nào để lấy dấu thời gian này ở định dạng tôi muốn, Oracle SQL

Như @Gordon đã nói, dấu thời gian (và ngày tháng) không được lưu trữ ở định dạng mà bạn có thể nhận ra Oracle sử dụng một biểu diễn nội bộ mà bạn không bao giờ thực sự cần biết hoặc kiểm tra (nhưng nó được ghi lại nếu bạn quan tâm đến loại điều đó) .

Khi bạn truy vấn một dấu thời gian, nó được hiển thị bằng cách sử dụng cài đặt NLS của khách hàng của bạn, trừ khi bạn có một ứng dụng khách ghi đè chúng. Tôi có thể thiết lập phiên của mình để phù hợp với những gì bạn đang thấy:

alter session set nls_timestamp_format = 'DD-MON-RR HH.MI.SS.FF AM';

select to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_CHAR(SYSTIMESTAM
-------------------
2018-07-10 15:37:31

select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_TIMESTAMP(TO_CHAR(SYSTIMESTA
-------------------------------
10-JUL-18 03.37.31.000000000 PM

Và tôi có thể thay đổi nó theo những gì bạn muốn xem:

alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS';

select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;

TO_TIMESTAMP(TO_CHA
-------------------
2018-07-10 15:37:32

Nhưng tất cả những gì bạn đang làm là chuyển đổi từ một dấu thời gian với múi giờ (chính là systimestamp là) vào một chuỗi và sau đó quay lại dấu thời gian. Bạn đang mất phần múi giờ và bất kỳ phân số giây nào; mà bạn cũng có thể làm với cast :

select cast(systimestamp as timestamp(0)) from dual;

CAST(SYSTIMESTAMPAS
-------------------
2018-07-10 15:37:32

Bạn có thể xem múi giờ và phần giây bằng timestamp_tz mặc định của mình định dạng:

select systimestamp from dual;

SYSTIMESTAMP                        
------------------------------------
2018-07-10 15:37:33.776469000 +01:00

và thay đổi nó bằng một alter khác :

alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM';

select systimestamp from dual;

SYSTIMESTAMP                  
------------------------------
2018-07-10 15:37:34.070 +01:00

Điều này không hoàn toàn phù hợp nếu bạn thực sự đang nói về việc lưu trữ dấu thời gian trong bảng, nhưng cho thấy rằng có các biến thể.

Trong bảng của bạn, hãy tạo kiểu dữ liệu timestamp (hoặc timestamp with time zone hoặc timestamp with local time zone ), và chỉ lo lắng về việc định dạng giá trị dưới dạng một chuỗi để trình bày cho người dùng cuối, vào thời điểm cuối cùng có thể.

Khi bạn cần hiển thị nó, nếu định dạng hiển thị quan trọng với bạn thì hãy sử dụng to_char() với mặt nạ định dạng rõ ràng - đừng cho rằng bất kỳ ai khác đang chạy truy vấn của bạn sẽ có cùng cài đặt NLS. Như bạn có thể thấy, thật dễ dàng để thay đổi những điều đó để sửa đổi đầu ra. (Hầu hết các ứng dụng khách đều có cách cho phép bạn đặt giá trị mặc định để bạn không phải thực hiện cùng một alter lệnh mỗi khi bạn kết nối; ví dụ. trong SQL Developer, từ Tools-> Preferences-> Database-> NLS). Nếu bạn muốn luôn hiển thị cùng một định dạng thì hãy sử dụng một cái gì đó như:

select to_char(your_column, 'YYYY-MM-DD HH24:MI:SS') as column_alias
from your_table
where your_column < timestamp '2018-01-01 00:00:00'

điều này cũng hiển thị giá trị cột đang được lọc (dưới dạng vẫn còn dấu thời gian) bằng cách sử dụng ký tự dấu thời gian.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. vượt quá số lượng cấp SQL đệ quy tối đa (50)

  2. CHÈN ORACLE TRIGGER VÀO ... (CHỌN * ...)

  3. Vòng lặp các giá trị, tạo truy vấn động và thêm vào tập kết quả

  4. Cách biên dịch các tệp nguồn bổ sung trong cmake sau quá trình xây dựng

  5. oracledb chuỗi sql cuộc gọi sử dụng các lời hứa