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