Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment travailler avec les fonctions de date dans Oracle sql

Ce post, j'essaie d'expliquer beaucoup de choses sur la date dans Oracle comme les fonctions de date Oracle SQL, le format de date Oracle SQL, la comparaison de date Oracle SQL, la différence de date Oracle en années, la différence de date Oracle en jours, la différence de date Oracle en mois

Oracle a fourni des types de date et d'horodatage pour stocker les informations de date et d'heure dans la base de données Oracle.

Type de données de date

DATE est le type de données oracle que nous connaissons tous lorsque nous pensons à la représentation des valeurs de date et d'heure. Il a la capacité de stocker le mois, le jour,
l'année, le siècle, les heures, les minutes et les secondes. Le problème avec le type de données DATE est sa granularité lorsque vous essayez de déterminer un intervalle de temps entre deux événements lorsque les événements se produisent à moins d'une seconde d'intervalle. Ce problème est résolu avec le type de données TIMESTAMP

Horodatage

Oracle a développé le type de données DATE et nous a donné le type de données TIMESTAMP qui stocke toutes les informations stockées par le type de données DATE, mais inclut également les secondes fractionnaires. Si vous souhaitez convertir un type de données DATE en un format de type de données TIMESTAMP, vous pouvez utiliser la fonction CAST

SQL> SELECT CAST(last_login_date AS TIMESTAMP) "Date" FROM utilisateurs ; Date------------------------------- ----------------------20-AVR-16 01.55.14.000000 PM21-JUN-16 14.16.36.000000 AM21-JUL-16 10.16.36.000000 AM21-SEP- 16 11.16.36.000000 AM21-DEC-16 11.16.36.000000 AM

Afin d'obtenir la date et l'heure système renvoyées dans un type de données TIMESTAMP, vous pouvez utiliser la fonction SYSTIMESTAMP telle que :

SQL> SELECT SYSTIMESTAMP FROM DUAL;SYSTIMESTAMP------------------------------------------- -----------------------------------------01-SEP-19 01.02.17.158913 PM -04:00 

Quelques points importants

1) Les types DATE et TIMESTAMP contiennent toujours un composant de date et d'heure. À minuit exactement, l'heure est 00:00:00.

SELECT TO_CHAR(SYSDATE, 'MM/DD/YYYY HH:MI:SS AM') date_with_time,TRUNC(SYSDATE) aujourd'hui,TO_CHAR(TRUNC(SYSDATE), 'MM/DD/YYYY HH:MI:SS AM' ) date_with_time_midnightFROM double 2 3 4 ;DATE_WITH_TIME TODAY DATE_WITH_TIME_MIDNIGHT---------------------- --------- --------- --------------27/10/2016 11:01:00 27-OCT-16 27/10/2016 00:00:00

2) Ne vous fiez jamais aux conversions implicites de chaînes en dates ou de dates en chaînes. Effectuez toujours explicitement les conversions avec les fonctions TO_CHAR, TO_DATE et TO_TIMESTAMP, ou utilisez les littéraux ANSI DATE ou TIMESTAMP.
3) Lorsque vous effectuez des comparaisons de date ou d'horodatage, tenez toujours compte de l'impact du composant temporel. Si vous souhaitez déduire la composante temporelle de la comparaison, utilisez le TRUNC ou ROND fonctions pour le supprimer des deux côtés de la comparaison.

select * from fnd_table where trunc(creation_date)  

4) Vous pouvez afficher le format de date requis en utilisant nls_date_format au niveau de la session

Changer le format de date dans oracle en utilisant nls_date_format

ALTER SESSION SET NLS_DATE_FORMAT ='YYYY MM DD';sélectionnez sysdate à partir de dual;ALTER SESSION SET NLS_DATE_FORMAT ='HH24:MI:SS';sélectionnez sysdate à partir de dual;alter session set nls_date_format ='dd-mon-yyyy hh24 :mi:ss';select sysdate from dual;

5) Voici un bon résumé des formats d'heure que nous pouvons utiliser

Élément Description
Éléments de format de date
SCC ou CC Siècle ; S préfixe la date BC avec –
AAAA ou SYYYY Année ; S préfixe la date BC avec –
AAAA ou AA ou A Les 3, 2 ou 1 derniers chiffres de l'année
A,AAAA Année avec une virgule à cette position
IYYY, IYY, IY, I Année à 4, 3, 2 ou 1 chiffres selon la norme ISO
ANNÉE ou ANNÉE Année en toutes lettres ; S préfixe la date BC avec –
BC ou AD Indicateur BC/AD
C.-B. ou A.D. Indicateur BC/AC avec périodes
Q Trimestre de l'année
MM Mois, valeur à deux chiffres
MOIS Nom du mois rempli d'espaces jusqu'à 9 caractères
LUN Nom du mois, abréviation à trois lettres
RM Mois en chiffres romains
WW ou W Semaine de l'année ou du mois
JJ ou JJ ou D Jour de l'année, du mois ou de la semaine
JOUR Nom du jour rempli d'espaces jusqu'à 9 caractères
DY Nom du jour ; Abréviation de 3 lettres
J Jour julien ; le nombre de jours depuis le 31 décembre 4713 avant JC
Éléments de format d'heure
AM ou PM Indicateur de méridien
M.A. ou PM Indicateur de méridien avec périodes
HH ou HH12 ou HH24 Heure du jour ou heure(1-12) ou heure(0-23)
MI Minute (0-59)
SS Deuxième (0-59)
SSSS Minutes après minuit (0-86399)
Suffixes
TH Numéro ordinal (c'est-à-dire DDTH pour 5TH)
SP Numéro épelé (c'est-à-dire DDSP pour CINQ)
SPTH ou THSP Numéros ordinaux épelés (c'est-à-dire DDSPTH pour FIFTH)
Autres éléments de formatage
/ , . La ponctuation est reproduite dans le résultat
"du" La chaîne entre guillemets est reproduite dans le résultat

fonctions de date d'oracle

Nous avons appris le type de données Date et Horodatage dans la section précédente. Nous allons maintenant voir en détail les fonctions de date oracle importantes et comment nous pouvons les utiliser

ADD_MONTHS 

Fonction de date Description
ADD_MONTHS (date, n) Renvoie une valeur de date après avoir ajouté 'n' mois à la date 'x'.
sélectionnez ADD_MONTHS ('16-Sep-81', 3)      à partir de deux ----------------------------------------16-Dec- 81

ADD_MONTHS décale toujours la date de mois entiers. Vous pouvez fournir une valeur fractionnaire pour le paramètre month_shift, mais ADD_MONTHS arrondira toujours au nombre entier le plus proche de zéro, comme illustré dans ces
exemples :

Alors

sélectionnez ADD_MONTHS ('28-FEB-2005', 1.5)              à partir du double -------------------------------- -----------31-mars-2005

Nous pouvons également utiliser des valeurs négatives

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

Dernier_jour

Fonction de date Description
LAST_DAY (x) Il est utilisé pour déterminer le nombre de jours restant dans un mois à partir de la date ‘x’ spécifiée.

La fonction LAST_DAY renvoie la date du dernier jour du mois pour une date donnée. Cette fonction est utile car le nombre de jours dans un mois varie tout au long de l'année.

sélectionnez LAST_DAY ('01-Jun-16')     à partir du double--------------------------------- ------------------30-juin-2016

Prochain_jour

Fonction de date Description
NEXT_DAY (x, week_day) Renvoie la date suivante du "week_day" à ou après la date "x".

NEXT_DAY renvoie la date du premier jour de la semaine nommé par jour qui est postérieur à la date. Le type de retour est toujours DATE, quel que soit le type de données de date. Le jour de l'argument doit être un jour de la semaine dans la langue de date de votre session, soit le nom complet ou l'abréviation

sélectionnez NEXT_DAY ('01-Jun-08', 'Wednesday')       à partir du double------------------------------ --------------04-JUN-08

MONTHS_BETWEEN 

Fonction de date Description
MONTHS_BETWEEN (x1, x2) Renvoie le nombre de mois entre les dates x1 et x2.

La fonction MONTHS_BETWEEN calcule le nombre de mois entre deux dates et renvoie cette différence sous forme de nombre

Les règles de calcul sont

1) Si date1 est postérieure à date2, alors MONTHS_BETWEEN renvoie un nombre positif.
2) Si date1 est antérieur à date2, alors MONTHS_BETWEEN renvoie un nombre négatif.
3) Si date1 et date2 tombent toutes deux le dernier jour de leurs mois respectifs, alors MONTHS_BETWEEN renvoie un nombre entier (pas de composante fractionnaire).
4) Si date1 et date2 sont dans des mois différents et qu'au moins une des dates n'est pas le dernier jour du mois, MONTHS_BETWEEN renvoie un nombre fractionnaire. La composante fractionnaire est calculée sur une base de 31 jours et prend également en compte toute différence dans la composante temporelle de date1 et date2.

Exemples

sélectionnez MONTHS_BETWEEN ('29-FEB-2016', '31-MAR-20')    à partir du double------------------------------ -------------------------------------------------- -----1sélectionnez  MONTHS_BETWEEN ('31-MAR-1995', '28-FEB-1994') à partir du double ------------------------ -------------------------------------------------- -----13sélectionnez  MONTHS_BETWEEN ('31-JAN-2006', '10-MAR-2006') à partir du double ------------------------ -------------------------------------------------- ---1.3225806SELECT MONTHS_BETWEEN(TO_DATE('02-02-1995','MM-DD-YYYY'),TO_DATE('01-01-1995','MM-DD-YYYY') ) "Mois" DE DOUBLE;Mois----------1.03225806

Un point important à retenir

MONTHS_BETWEEN calcule la composante fractionnaire du nombre de mois en supposant que
chaque mois compte 31 jours. Ainsi, chaque jour supplémentaire sur un mois complet compte pour 1/31 de mois, et :
1 divisé par 31 =0,032258065

Ronde 

Fonction de date Description
ROND (x, date_format) Renvoie la date « x » arrondie au siècle, à l'année, au mois, à la date, à l'heure, à la minute ou à la seconde le plus proche, comme spécifié par le « date_format ».

La fonction ROUND arrondit une valeur de date à la date la plus proche comme spécifié par un masque de format. C'est comme la fonction numérique ROUND standard, qui arrondit un nombre au nombre le plus proche de la précision spécifiée, sauf qu'elle fonctionne avec des dates

Exemples

Sélectionnez ROUND (TO_DATE ('12-MAR-2016'), 'MONTH') à partir du double ;01-MAR-2016Sélectionnez ROUND (TO_DATE ('17-MAR-2016'), 'MONTH') à partir du double ;01 -AVR-2016sélectionnez ROUND (TO_DATE ('01-MAR-2007'), 'YYYY') de double ;01-JAN-2007sélectionnez ROUND (TO_DATE ('01-SEP-2007'), 'YEAR') de double ;01 -JAN-2008

tronquer

Fonction de date Description
TRUNC (x, date_format) Renvoie la date « x » inférieure ou égale au siècle, à l'année, au mois, à la date, à l'heure, à la minute ou à la seconde le plus proche, comme spécifié par le « date_format ».

Exemples

Sélectionnez TRUNC (TO_DATE ('12-MAR-2016'), 'MONTH') à partir du double ;01-MAR-2016 Sélectionnez TRUNC (TO_DATE ('17-MAR-2016'), 'MONTH') à partir du double ; 01-MAR-2016 sélectionnez TRUNC (TO_DATE ('01-MAR-2007'), 'YYYY') de double ; 01-JAN-2007sélectionnez TRUNC (TO_DATE ('01-SEP-2007'), 'YEAR') de double;01-JAN-2007

Arithmétique avec date Oracle

Nous pouvons effectuer de nombreuses opérations arithmétiques sur le type de données oracle date. Nous pouvons ajouter ou soustraire un nombre à ou à partir d'une date pour une valeur de date résultante. nous pouvons soustraire deux dates pour trouver le nombre de jours entre ces dates. nous ajoutons des heures à ce jour en divisant le nombre d'heures par 24.

Exemples d'addition et de soustraction

SQL> sélectionnez 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

D'autres façons de l'utiliser sont

Description Expression de date
Maintenant Date du système
Demain/après-demain Date système +1
Il y a sept jours SYSDATE -7
Dans une heure SYSDATE + 1/24
Dans trois heures SYSDATE + 3/24  ou SYSDATE + 1/8
Dans une demi-heure SYSDATE + 1/48
Dans 10 minutes SYSDATE + 10/1440
30 secondes à partir de maintenant SYSDATE + 30/86400

Opération arithmétique sur la différence de date pour trouver le nombre de jours entre eux

Nous pouvons soustraire deux dates pour trouver  la différence de jours entre  les dates

Si la partie horaire est la même, alors ce sera toujours un nombre entierSELECT 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_daysFROM   dual;DIFF_IN_DAYS----------6Si la partie horaire n'est pas la même, alors il aura toujours des composants fractionnairesSELECT 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_daysFROM     dual;DIFF_IN_DAYS----------5.95833333SQL> 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_daysFROM   double ;DIFF_IN_DAYS----------6.04166666

Nous pouvons trouver la différence de date oracle en mois à l'aide de la requête

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_daysFROM DUAL;Diff_in_Months      diff_in_days--------- -------------------------------1.03225806              32

Nous pouvons également trouver la différence de date oracle en années à l'aide de la requête

SELECT (TO_DATE('20130525', 'YYYYMMDD') - TO_DATE('20100101', 'YYYYMMDD')) diff_in_days , MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD ')) Diff_en_mois,TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))) Diff_in_months_no_fraction,TRUNC(TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'YYYMMDD')YYYMMDD , 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_monthsfrom 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 30 30 30 40 40. 


J'espère que vous aimez le message sur le type de données de date oracle. J'ai essayé d'expliquer diverses choses telles que les fonctions de date Oracle, le format de date Oracle SQL, la comparaison de dates Oracle SQL, la différence de date Oracle en années, la différence de date Oracle en jours, la différence de date Oracle en mois. Ce n'est pas un guide complet mais j'ai essayé de présenter beaucoup d'informations utiles pour le développeur Oracle SQL

Articles connexes

comment écrire des requêtes sql
Tutoriel Oracle SQL :Instruction Sql de base
Tutoriel Oracle SQL :Restriction de l'ensemble de données
Fonctions à une seule ligne dans SQL
Traitement de décodage Oracle SQL
Télécharger Développeur Oracle SQL
https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm#OLADM780