Chuyển đổi dấu thời gian Unix sang DATETIME trong Chế độ xem


7

Tôi có một bảng lưu trữ dấu thời gian unix. Để truy vấn ngày này dưới dạng ngày, tôi đang cố gắng chuyển đổi dấu thời gian này thành loại thời gian trong chế độ xem. Thật không may, tôi dường như chỉ có thể lấy phần DATE ra.

Liên kết này mô tả cách thực hiện chuyển đổi, nhưng yêu cầu thay đổi nls_date_formatđể bao gồm phần thời gian. Mặc định hiện chỉ hiển thị phần ngày. Tôi cần ngày và thời gian.

Thật không may, giải pháp đó chỉ hoạt động ở cấp độ phiên. Là một nhà phát triển, tôi không cần phải chạy đến nhà cung cấp dịch vụ được quản lý của chúng tôi để yêu cầu họ thay đổi giá trị ở cấp cơ sở dữ liệu - đặc biệt là vì nó có thể ảnh hưởng đến các ứng dụng khác.

Có cách nào để tôi có thể chuyển đổi dấu thời gian, tính bằng sql, sang datetime mà không cần sửa đổi hệ thống không?

Câu trả lời:


12

kết quả của biểu thức

to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(1244108886,'SECOND')

là một giá trị của DATE datatype DATE. Loại này chứa ngày và thời gian. Nếu bạn muốn hiển thị giá trị này cho người dùng, bạn phải chuyển đổi nó thành một chuỗi. Việc chuyển đổi này có thể được thực hiện bởi một ứng dụng hoặc bạn có thể để oracle chuyển đổi nó thành một loại chuỗi như được thực hiện trong ví dụ này. Việc chuyển đổi tự động này thành chuỗi tìm kiếm VARCHAR2 được điều khiển bởi nls_date_format và một số cài đặt máy chủ. Nếu bạn muốn chế độ xem của mình trả về giá trị VARCHAR2 với ngày được tính theo định dạng 'YYYY-MM-DD HH24: MI: SS' và không phải là giá trị DATE, bạn có thể thực hiện điều này bằng cách sử dụng hàm chuyển đổi: biểu thức

to_char(to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(1244108886,'SECOND'),'YYYY-MM-DD HH24:MI:SS')

Nhưng trong trường hợp này, giá trị trả về của chế độ xem là VARCHAR2 chứ không phải giá trị DATE.


5

Cách tốt nhất là tránh các lệnh gọi hàm không phải SQL bên trong các truy vấn SQL vì hàm này có thể không có sẵn trên toàn cầu - trong hệ thống của tôi không có hàm numtodsinterval - cũng vì chi phí bổ sung để chuyển ngữ cảnh từ SQL sang PL / SQL và sau đó trở lại SQL cho mỗi hàng được trả về hoặc được kiểm tra nếu hàm được gọi trong mệnh đề where.

Đây là một giải pháp chỉ dành cho SQL.

TO_DATE('1970-01-01','YYYY-MM-DD') + unix_timestamp / 86400

Lưu ý rằng kết quả là giá trị Oracle DATE cũng chứa TIME. Nếu nó không xuất hiện THỜI GIAN khi bạn chạy truy vấn, thì vấn đề nằm ở NLS_DATE_FORMAT hoặc việc bạn thực hiện chuyển đổi ngày thành chuỗi. Hãy chắc chắn tự làm TO_CHAR với phần thời gian trong chuỗi định dạng để xem toàn bộ giá trị. ví dụ TO_CHAR (a_date, 'yyyy-mm-dd hh24: mi: ss')


1

Tôi đã sử dụng một số khác để tính giá trị này.

select (TO_DATE('1970-01-01','YYYY-MM-DD') + unix_timestamp / 86400000) from dbname;

Kịch bản này hoạt động tốt cho tôi.


Có vẻ không ổn với tôi.
Colin 't Hart

Sẽ ổn nếu và chỉ khi unix_timestamp được đưa ra trong một phần nghìn giây (mặc dù điều này khá bất thường).
Frank Schmitt

Đây là trường hợp nếu dấu thời gian đang được lưu trữ bởi Hibernate.
Daniel Gray

Rất phổ biến với phần mềm java nói chung để lưu trữ giá trị giống như dấu thời gian trong một mili giây.
Dan Pritts

0

Nếu unix_timestamp phải được so sánh với một số phạm vi ngày trong mệnh đề WHERE, tốt nhất là chuyển đổi ngày thành unix_timestamp thay vì chuyển đổi tất cả các giá trị unix_timestamp thành ngày.

Ví dụ: các mục sau đây có thể tìm thấy các hàng có UNIX_TIMESTAMP giữa ngày bắt đầu được chỉ định và ngày kết thúc.

WHERE unix_timestamp BETWEEN
       (:start_date - TO_DATE('1970-01-01','YYYY-MM-DD')) * 86400
       AND 
       (:end_date - TO_DATE('1970-01-01','YYYY-MM-DD')) * 86400

Điều này cũng sẽ cho phép một chỉ mục trên UNIX_TIMESTAMP được sử dụng, nếu có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.