CURRENT_DATE
trả về ngày và giờ của phiên. SYSDATE
trả về ngày và giờ của cơ sở dữ liệu. Các giá trị này có thể khác nhau vì chúng tôi có thể thay đổi múi giờ của phiên bằng cách sử dụng ALTER SESSION
. Có thể bạn nên sử dụng SYSDATE
bởi vì nó trả về một giá trị nhất quán, mặc dù không biết bối cảnh kinh doanh của bạn thì khó có thể chắc chắn.
Từ câu hỏi của bạn, tôi nghi ngờ bạn không nhận ra rằng cột giả ngày của Oracle bao gồm yếu tố thời gian. Hãy thử điều này:
alter session set nls_date_format='dd-mon-yyyy hh24Lmi:ss'
/
select current_date from dual
/
select sysdate from dual
/
Không có nhiều điểm trong việc bao bọc một trong những cột giả đó trong hàm do người dùng xác định của riêng bạn. Một lần tôi nghiêm túc xem xét nó là để giúp việc đưa thời gian vào một số bài kiểm tra đơn vị tự động dễ dàng hơn. Nhưng tôi chưa bao giờ thuyết phục bản thân rằng cơ sở này sẽ biện minh cho việc không sử dụng cách tiếp cận tiêu chuẩn.
chỉnh sửa
Giải pháp trong câu trả lời được chấp nhận hoạt động nhưng có rất nhiều hành lý không cần thiết. Tất cả PL / SQL bổ sung đó chạy chậm hơn 2-3 lần so với select sysdate from dual;
. Đúng là đây là những khác biệt rất nhỏ về mặt tuyệt đối - mili giây, nếu vậy. Nhưng trong một hệ thống bận rộn với rất nhiều lệnh gọi đến getSysdate()
tất cả những mili giây đó có thể tăng thêm một lượng lớn thời gian. Giải pháp tốt hơn sẽ là thay thế tất cả mã đó bằng return sysdate
đơn giản; Điều này hơi chậm hơn so với việc gọi sysdate
trực tiếp nhưng chỉ một chút.
Mở rộng trên bình luận của dpbradley, tôi đã gõ một chức năng cho phép chúng tôi thay thế một thời gian đồng hồ khác từ cơ sở dữ liệu, cho mục đích thử nghiệm. Tôi đang lưu trữ ngày giờ thay thế của mình trong không gian tên CLIENT_INFO trong ngữ cảnh mặc định; nếu tôi đang triển khai điều này trong hệ thống sản xuất, tôi sẽ xây dựng một ngữ cảnh do người dùng xác định riêng cho nó.
Vì vậy, đây là bước của tôi về getSysdate()
chức năng ...
SQL> create or replace function myGetSysdate
2 ( p_alt_date in varchar2 := null )
3 return date is
4 begin
5 if p_alt_date is null then
6 return sysdate;
7 else
8 return to_date(sys_context('userenv', p_alt_date)
9 , 'dd-mon-yyyy hh24:mi:ss');
10 end if;
11 end;
12 /
Function created.
SQL>
Đây là cách chúng tôi đặt ngày giờ thay thế ...
SQL> exec dbms_application_info.set_client_info('01-DEC-2010 12:12:12')
PL/SQL procedure successfully completed.
Nếu không có tham số nào được chuyển, nó sẽ trả về sysdate
(tùy chọn mặc định và ưu tiên).
SQL> select getsysdate from dual
2 /
GETSYSDATE
-----------------
05-JAN-2010 16:25
SQL>
Nếu chúng ta vượt qua một không gian tên ngữ cảnh khi chúng ta gọi hàm, chúng ta sẽ nhận được ngày giờ thay thế ....
SQL> select mygetsysdate('CLIENT_INFO') from dual
2 /
MYGETSYSDATE('CLI
-----------------
01-DEC-2010 12:12
SQL>