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

Tạo một hàm để trả về ngày và giờ hiện tại trong oracle

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>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nối hai bảng khi không có giá trị nào trong một bảng

  2. Oracle cắt bỏ khoảng trắng ở bên trong chuỗi

  3. Oracle:OALL8 ở trạng thái không nhất quán

  4. Làm cách nào để sử dụng SQL * Plus để tạo các dạng xem / bảng với một dòng trống ở giữa câu lệnh tạo?

  5. Trình điều khiển Oracle UCP và tomcat:các luồng không dừng được