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

Cách làm việc với các Hàm ngày trong Oracle sql

Bài đăng này tôi đang cố gắng giải thích nhiều điều về ngày tháng trong oracle như các hàm date trong oracle sql, định dạng ngày oracle sql, so sánh ngày oracle sql, chênh lệch ngày oracle theo năm, chênh lệch ngày oracle theo ngày, chênh lệch ngày oracle trong tháng

Oracle đã cung cấp các loại ngày và dấu thời gian để lưu trữ thông tin ngày và giờ trong cơ sở dữ liệu oracle.

Loại dữ liệu ngày

DATE là kiểu dữ liệu oracle mà tất cả chúng ta đều quen thuộc khi nghĩ về việc biểu diễn các giá trị ngày và giờ. Nó có khả năng lưu trữ tháng, ngày,
năm, thế kỷ, giờ, phút và giây. Vấn đề với loại dữ liệu DATE là độ chi tiết của nó khi cố gắng xác định khoảng thời gian giữa hai sự kiện khi các sự kiện xảy ra trong một giây của nhau. Sự cố này được giải quyết bằng loại dữ liệu TIMESTAMP

Dấu thời gian

Oracle đã mở rộng trên loại dữ liệu DATE và đã cung cấp cho chúng tôi loại dữ liệu TIMESTAMP lưu trữ tất cả thông tin mà loại dữ liệu DATE lưu trữ, nhưng cũng bao gồm các giây phân số. Nếu bạn muốn chuyển đổi kiểu dữ liệu DATE thành định dạng kiểu dữ liệu TIMESTAMP, bạn có thể sử dụng hàm CAST

SQL> SELECT CAST(last_login_date AS TIMESTAMP) "Date" FROM users;
Date
-----------------------------------------------------
20-APR-16 01.55.14.000000 PM
21-JUN-16 14.16.36.000000 AM
21-JUL-16 10.16.36.000000 AM
21-SEP-16 11.16.36.000000 AM
21-DEC-16 11.16.36.000000 AM

Để lấy ngày và giờ hệ thống được trả về trong kiểu dữ liệu TIMESTAMP, bạn có thể sử dụng hàm SYSTIMESTAMP chẳng hạn như:

SQL> SELECT SYSTIMESTAMP FROM DUAL;

SYSTIMESTAMP
---------------------------------------------------------------------------
01-SEP-19 01.02.17.158913 PM -04:00

Một số điểm quan trọng

1) Cả hai loại DATE và TIMESTAMP luôn chứa thành phần ngày và giờ. Đúng nửa đêm, thời gian là 00:00:00.

SELECT TO_CHAR(SYSDATE, 'MM/DD/YYYY HH:MI:SS AM') date_with_time
,TRUNC(SYSDATE) today
,TO_CHAR(TRUNC(SYSDATE), 'MM/DD/YYYY HH:MI:SS AM') date_with_time_midnight
FROM dual 2 3 4 ;DATE_WITH_TIME TODAY DATE_WITH_TIME_MIDNIGHT
---------------------- --------- ----------------------
10/27/2016 11:01:00 AM 27-OCT-16 10/27/2016 12:00:00 AM

2) Không bao giờ dựa vào các chuyển đổi ngầm định của chuỗi thành ngày tháng hoặc ngày thành chuỗi. Luôn thực hiện rõ ràng các chuyển đổi với các hàm TO_CHAR, TO_DATE và TO_TIMESTAMP hoặc sử dụng các ký tự ANSI DATE hoặc TIMESTAMP.
3) Khi thực hiện so sánh ngày hoặc dấu thời gian, hãy luôn xem xét tác động của thành phần thời gian. Nếu bạn muốn chiết khấu thành phần thời gian khỏi so sánh, hãy sử dụng TRUNC hoặc ROUND chức năng loại bỏ nó khỏi cả hai phía của so sánh.

select * from fnd_table where trunc(creation_date) < trunc(sysdate);

4) Bạn có thể hiển thị định dạng ngày bắt buộc bằng cách sử dụng nls_date_format ở cấp phiên

Thay đổi định dạng ngày trong oracle bằng nls_date_format

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY MM DD';
select sysdate from dual;

ALTER SESSION SET NLS_DATE_FORMAT = 'HH24:MI:SS';
select sysdate from dual;

alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss';
select sysdate from dual;

5) Dưới đây là một bản tóm tắt tốt về các định dạng thời gian mà chúng ta có thể sử dụng

Element Mô tả
Phần tử định dạng ngày
SCC hoặc CC Thế kỷ; Tiền tố S ngày BC bằng -
YYYY hoặc SYYYY Năm; Tiền tố S ngày BC bằng -
YYY hoặc YY hoặc Y 3, 2 hoặc 1 chữ số cuối cùng của năm
Y, YYY Năm có dấu phẩy ở vị trí này
IYYY, IYY, IY, I năm 4, 3, 2 hoặc 1 chữ số dựa trên tiêu chuẩn ISO
SYEAR hoặc YEAR Năm đánh vần; Tiền tố S ngày BC bằng -
BC hoặc AD Chỉ báo BC / AD
B.C. hoặc A.D. Chỉ báo BC / AC với các khoảng thời gian
Q Quý trong năm
MM Tháng, giá trị hai chữ số
THÁNG Tên tháng được đệm bằng khoảng trống có độ dài 9 ký tự
THÁNG Tên tháng, ba chữ cái viết tắt
RM Tháng số La Mã
WW hoặc W Tuần trong năm hoặc tháng
DDD hoặc DD hoặc D Ngày trong năm, tháng hoặc tuần
NGÀY Tên ngày được đệm bằng khoảng trống có độ dài 9 ký tự
DY Tên của ngày; 3 chữ cái viết tắt
J ngày Julian; số ngày kể từ ngày 31 tháng 12 năm 4713 trước Công nguyên
Yếu tố định dạng thời gian
AM hoặc PM Chỉ báo kinh tuyến
A.M. hoặc P.M. Chỉ báo kinh tuyến với các khoảng thời gian
HH hoặc HH12 hoặc HH24 Giờ trong ngày hoặc giờ (1-12) hoặc giờ (0-23)
MI Phút (0-59)
SS Thứ hai (0-59)
SSSSS Giây trước nửa đêm (0-86399)
Hậu tố
TH Số thứ tự (tức là DDTH cho 5TH)
SP Số đánh vần (tức là DDSP cho NĂM)
SPTH hoặc THSP Số thứ tự đánh vần (tức là DDSPTH cho FIFTH)
Các phần tử định dạng khác
/,. Dấu câu được tái tạo trong kết quả
“trong số” Chuỗi trích dẫn được tái tạo trong kết quả

các hàm ngày oracle

Chúng ta đã tìm hiểu về kiểu dữ liệu Ngày và Dấu thời gian trong phần trước. Bây giờ chúng ta sẽ xem chi tiết các hàm ngày oracle quan trọng và cách chúng ta có thể sử dụng chúng

ADD_MONTHS

Hàm ngày Mô tả
ADD_MONTHS (ngày, n) Trả về giá trị ngày sau khi thêm ‘n’ tháng vào ngày ‘x’.
select ADD_MONTHS ('16-Sep-81', 3)      from dual
----------------------------
16-Dec-81

ADD_MONTHS luôn thay đổi ngày theo tháng. Bạn có thể cung cấp giá trị phân số cho thông số month_shift, nhưng ADD_MONTHS sẽ luôn làm tròn xuống số nguyên gần nhất với số 0, như được hiển thị trong các
ví dụ sau:

Vì vậy,

select ADD_MONTHS ('28-FEB-2005', 1.5)              from dual
-------------------------------------------
31-Mar-2005

Chúng tôi cũng có thể sử dụng các giá trị âm

select ADD_MONTHS ('28-FEB-2005', -1)                from dual
------------------------------
31-Jan-2005

Last_day

Hàm ngày Mô tả
LAST_DAY (x) Nó được sử dụng để xác định số ngày còn lại trong một tháng kể từ ngày "x" được chỉ định.

Hàm LAST_DAY trả về ngày của ngày cuối cùng của tháng cho một ngày nhất định. Chức năng này rất hữu ích vì số ngày trong tháng thay đổi trong năm.

select LAST_DAY ('01-Jun-16')     from dual
----------------------------------------------------
30-Jun-2016

Next_day

Hàm ngày Mô tả
NEXT_DAY (x, tuần_ngày) Trả về ngày tiếp theo của ‘tuần_ngày’ vào hoặc sau ngày ‘x’ xảy ra.

NEXT_DAY trả về ngày của ngày trong tuần đầu tiên được đặt tên theo ngày muộn hơn ngày. Loại trả về luôn là DATE, bất kể loại dữ liệu của ngày. Ngày đối số phải là một ngày trong tuần bằng ngôn ngữ ngày trong phiên của bạn, tên đầy đủ hoặc chữ viết tắt

select NEXT_DAY ('01-Jun-08', 'Wednesday')       from dual
-------------------------------------------
04-JUN-08

MONTHS_BETWEEN

Hàm ngày Mô tả
MONTHS_BETWEEN (x1, x2) Trả về số tháng giữa ngày x1 và x2.

Hàm MONTHS_BETWEEN tính toán số tháng giữa hai ngày và trả về sự khác biệt đó dưới dạng một số

Quy tắc tính toán là

1) Nếu date1 đến sau date2 thì MONTHS_BETWEEN trả về một số dương.
2) Nếu date1 đến trước date2 thì MONTHS_BETWEEN trả về số âm.
3) Nếu date1 và date2 đều rơi vào ngày cuối cùng trong các tháng tương ứng của chúng, thì MONTHS_BETWEEN trả về một số nguyên (không có thành phần phân số).
4) Nếu date1 và date2 ở các tháng khác nhau và ít nhất một trong các ngày không phải là ngày cuối cùng trong tháng, thì MONTHS_BETWEEN trả về a Số phân số. Thành phần phân số được tính trên cơ sở 31 ngày và cũng xem xét bất kỳ sự khác biệt nào trong thành phần thời gian của date1 và date2.

Ví dụ

select MONTHS_BETWEEN ('29-FEB-2016', '31-MAR-20')    from dual
--------------------------------------------------------------------------------
-1

select  MONTHS_BETWEEN ('31-MAR-1995', '28-FEB-1994') from dual
-------------------------------------------------------------------------------
13

select  MONTHS_BETWEEN ('31-JAN-2006', '10-MAR-2006') from dual
----------------------------------------------------------------------------
-1.3225806

SELECT MONTHS_BETWEEN
(TO_DATE('02-02-1995','MM-DD-YYYY'),
TO_DATE('01-01-1995','MM-DD-YYYY') ) "Months"
FROM DUAL;

Months
----------
1.03225806

Một điểm quan trọng cần nhớ

MONTHS_BETWEEN tính toán thành phần phân số của số tháng bằng cách giả định rằng
mỗi tháng có 31 ngày. Do đó, mỗi ngày bổ sung trong một tháng hoàn chỉnh được tính cho 1/31 của một tháng và:
1 chia cho 31 =.032258065

Vòng

Hàm ngày Mô tả
ROUND (x, date_format) Trả về ngày ‘x’ được làm tròn thành thế kỷ, năm, tháng, ngày, giờ, phút hoặc giây như được chỉ định bởi ‘date_format’.

Hàm ROUND làm tròn giá trị ngày thành ngày gần nhất như được chỉ định bởi mặt nạ định dạng. Nó giống như hàm ROUND số tiêu chuẩn, làm tròn một số đến số chính xác được chỉ định gần nhất, ngoại trừ việc nó hoạt động với ngày tháng

Ví dụ

Select ROUND (TO_DATE ('12-MAR-2016'), 'MONTH') from dual;

01-MAR-2016

Select ROUND (TO_DATE ('17-MAR-2016'), 'MONTH') from dual;

01-APR-2016

select ROUND (TO_DATE ('01-MAR-2007'), 'YYYY') from dual;

01-JAN-2007

select ROUND (TO_DATE ('01-SEP-2007'), 'YEAR') from dual;

01-JAN-2008

Đường cắt ngắn

Hàm ngày Mô tả
TRUNC (x, date_format) Trả về ngày ‘x’ nhỏ hơn hoặc bằng thế kỷ, năm, tháng, ngày, giờ, phút hoặc giây gần nhất như được chỉ định bởi ‘date_format’.

Ví dụ

Select TRUNC (TO_DATE ('12-MAR-2016'), 'MONTH') from dual;
01-MAR-2016

 Select TRUNC (TO_DATE ('17-MAR-2016'), 'MONTH') from dual;
01-MAR-2016

 select TRUNC (TO_DATE ('01-MAR-2007'), 'YYYY') from dual;
01-JAN-2007

select TRUNC (TO_DATE ('01-SEP-2007'), 'YEAR') from dual;
01-JAN-2007

Số học với Oracle ngày

Chúng ta có thể thực hiện rất nhiều phép toán số học trên kiểu dữ liệu ngày oracle. Chúng ta có thể cộng hoặc trừ một số vào hoặc từ một ngày để có giá trị ngày kết quả. chúng ta có thể Trừ hai ngày để tìm số ngày giữa các ngày đó. chúng tôi Thêm giờ vào ngày bằng cách chia số giờ cho 24.

Ví dụ về phép cộng và phép trừ

SQL> select sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400 from dual;
SYSDATE              SYSDATE+1/24         SYSDATE+1/1440       SYSDATE+1/86400
-------------------- -------------------- -------------------- --------------------

01-Jul-2016 06:32:12 01-Jul-2016 07:32:12 01-Jul-2016 06:33:12 01-Jul-2016 06:32:13

Các cách khác mà chúng tôi có thể sử dụng là

Description Biểu thức ngày
Bây giờ Sysdate
Ngày mai / ngày sau Sysdate +1
Bảy ngày trước SYSDATE -7
Một giờ kể từ bây giờ SYSDATE + 1/24
Ba giờ kể từ bây giờ SYSDATE + 3/24 hoặc SYSDATE + 1/8
Còn nửa giờ nữa SYSDATE + 1/48
10 phút kể từ bây giờ SYSDATE + 10/1440
30 giây kể từ bây giờ SYSDATE + 30/86400

Phép toán số học về chênh lệch ngày để tìm số ngày giữa chúng

Chúng ta có thể trừ hai ngày để tìm chênh lệch giữa các ngày

If the time part is same, then it will always whole number

SELECT TO_DATE('25-MAR-2016 11:00:00 AM', 'DD-MON-YYYY HH:MI:SS AM')

- TO_DATE('19-MAR-2016 11:00:00 AM', 'DD-MON-YYYY HH:MI:SS AM') diff_in_days
FROM   dual;

DIFF_IN_DAYS

----------

6

If the time part is not same, then it will always be having fractional components

SELECT TO_DATE('25-MAR-2016 10:00:00 AM', 'YYYYMMDD HH:MI:SS AM')

- TO_DATE('19-MAR-2016 11:00:00 AM', 'YYYYMMDD HH:MI:SS AM') diff_in_days
FROM     dual;

DIFF_IN_DAYS

----------

5.95833333

SQL> SELECT  TO_DATE('25-MAR-2016 11:00:00 AM', 'YYYYMMDD HH:MI:SS AM')

- TO_DATE('19-MAR-2016 10:00:00 AM', 'YYYYMMDD HH:MI:SS AM') diff_in_days
FROM   dual;

DIFF_IN_DAYS

----------

6.04166666

Chúng tôi có thể tìm thấy sự khác biệt ngày oracle trong các Tháng bằng cách sử dụng truy vấn

SELECT MONTHS_BETWEEN
(TO_DATE('02-02-1995','MM-DD-YYYY'),
TO_DATE('01-01-1995','MM-DD-YYYY') ) "Diff_in_Months", (TO_DATE('02-02-1995','MM-DD-YYYY')-
TO_DATE('01-01-1995','MM-DD-YYYY')  diff_in_days
FROM DUAL;Diff_in_Months      diff_in_days
----------------------------------------
1.03225806              32

Chúng tôi cũng có thể tìm thấy sự khác biệt về ngày thần tiên trong các năm bằng cách sử dụng truy vấn

SELECT (TO_DATE('20130525', 'YYYYMMDD') - TO_DATE('20100101', 'YYYYMMDD')) diff_in_days , MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD')) Diff_in_months
,TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))) Diff_in_months_no_fraction,
TRUNC(TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))) / 12) Diff_in_years_no_fraction
,MOD(TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))), 12) Diff_in_years_fraction_in_months
FROM dual;
DIFF_IN_DAYS   DIFF_IN_MONTHS  DIFF_IN_MONTHS_NO_FRACTION  DIFF_IN_YEAR_NO_FRACTION  DIFF_IN_YEARS_FRACTION_IN_MONTHS
____________________________________________________________________________________
1240                40.7741       40                                 3    4


Hy vọng bạn thích bài đăng trên oracle date datatype. Tôi đã cố gắng giải thích nhiều thứ khác nhau như các chức năng ngày oracle, định dạng ngày oracle sql, so sánh ngày oracle sql, chênh lệch ngày oracle theo năm, chênh lệch ngày oracle trong ngày, chênh lệch ngày oracle trong tháng. Đây không phải là một hướng dẫn đầy đủ nhưng tôi đã cố gắng trình bày rất nhiều thông tin hữu ích cho nhà phát triển oracle sql

Các bài viết có liên quan

cách viết truy vấn sql
Hướng dẫn sql Oracle:Câu lệnh Sql cơ bản
Hướng dẫn sql Oracle:Hạn chế tập dữ liệu
Các hàm hàng đơn trong sql
Xử lý giải mã sql Oracle
Tải xuống Nhà phát triển Oracle SQL
https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm#OLADM780


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi kích hoạt Oracle ORA-04091

  2. CHÈN câu lệnh CHỌN trong Oracle 11G

  3. Ví dụ về hàm Oracle để lấy số ngày giữa hai ngày

  4. Câu hỏi SQL phân cấp

  5. Làm thế nào để liệt kê tất cả các bảng trong Oracle