2009-07-21 34 views
34

Có lẽ là một cổ điển ... Bạn có biết một mẹo dễ dàng để lấy một giá trị UTC của SYSDATE trên Oracle hay không (tốt nhất là sẽ nhận được một cái gì đó làm việc trên phiên bản thứ 8).Cách lấy giá trị UTC cho SYSDATE trên Oracle

Để bây giờ tôi đã chức năng tùy chỉnh :(

Chúc mừng,

Stefan

Trả lời

30

Bạn có thể sử dụng

SELECT SYS_EXTRACT_UTC(TIMESTAMP '2000-03-28 11:30:00.00 -02:00') FROM DUAL; 

Bạn cũng có thể cần phải thay đổi múi giờ của bạn

ALTER SESSION SET TIME_ZONE = 'Europe/Berlin'; 

Hoặc đọc nó

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM dual; 
+1

Vâng, Bí quyết là để chuyển đổi từ SYSDATE. Vì vậy, trước tiên bạn sẽ cần phải bằng cách nào đó thiết lập những gì SESSIONTIMEZONE là, và sử dụng kiến ​​thức đó để có được giá trị bù đắp cho SYS_EXTRACT_UTC - phải không? – stic

+0

Có, bạn có thể kiểm tra liên kết này từ oracle nơi Datetime và Time Zone Parameters: http://www.oracle.com/technology/obe/obe9ir2/obe-nls/datetime/datetime.htm – Jonathan

+1

Tôi đã mở rộng câu trả lời do một lỗi phụ. –

32
select sys_extract_utc(systimestamp) from dual; 

sẽ không hoạt động trên Oracle 8, mặc dù.

19

Thông thường, tôi làm việc với các cột DATE chứ không phải TIMESTAMP lớn hơn nhưng chính xác hơn.

Sau đây sẽ trả về ngày UTC hiện tại chỉ như thế - NGÀY.

CAST(sys_extract_utc(SYSTIMESTAMP) AS DATE) 

Làm việc với ngày UTC thật tuyệt vì tôi không phải lo lắng về độ phức tạp của múi giờ. Chỉ hiển thị cuối cùng cho người dùng cần bù đắp hoặc sự cố khác.

+0

Tôi đã cố gắng so sánh 2 ngày với điều này (bằng) và không nhận được kết quả mong đợi vì vậy tôi nghĩ rằng vẫn còn một thành phần thời gian được trả về. Điều gì đã làm việc cho tôi là sử dụng câu lệnh TRUNC: Chọn * Từ mục Trường hợp TRUNC (Create_Date) = ( Chọn TRUNC (sys_extract_utc (SYSTIMESTAMP)) Từ DUAL) – DaveK

+2

Cột DATE bao gồm thành phần thời gian với độ chính xác đến một giây. Chúng khác với các cột TIMESTAMP trong đó TIMESTAMP lưu trữ độ chính xác lớn hơn một giây. Thật vậy, việc thêm TRUNC vào bên trên là những gì bạn muốn làm nếu bạn muốn cắt bớt thành phần thời gian. –

1

Nếu bạn muốn có một dấu thời gian thay vì chỉ hẹn hò với sysdate, bạn có thể chỉ định một múi giờ sử dụng systimestamp:

select systimestamp at time zone 'UTC' from dual 

kết quả đầu ra: 29-AUG-17 06.51.14.781998000 PM UTC

Các vấn đề liên quan