Expression régulière d'un certain format de date

J'ai besoin d'aide pour former une date d'expression régulière conformément au format YYYYMMDD. Vous trouverez ci-dessous les détails:

Vérification des données d'entrée: longueur entrée 8 et toutes les valeurs numériques.
Premier caractère - c'est 1 ou 2. 5-y. & Le 6ème caractère est entre 01 et 12,
Les deux derniers caractères sont entre 01 et 31

Je l'ai essayé sous l'expression, mais je ne peux pas comprendre comment nous pouvons fournir les gammes de valeurs, telles que 1-12 Pendant des mois I. 1-31 Pendant des jours.


SELECT 'P' from dual where REGEXP_LIKE /'122412','^[1][2][0-9]{2}[1|12]$'/;


Merci d'avance!
Invité:

Daniel

Confirmation de:

C'est une mauvaise idée. Seul

Le moyen de vérifier l'exactitude de la date est d'essayer de le convertir à la date. Si la transformation échoue, ce n'est pas la date; Si cela réussit, alors

peut

être. Les dates sont trop complexes pour l'analyse par la langue habituelle.

Donc, créez une fonction qui le convertit à la date; Tu peux faire if Beaucoup plus polyvalent que vous ici afin qu'il puisse être réutilisé à d'autres fins:


create or replace function validate_date /
PDate in varchar2
, PDateFormat in varchar2
/ return date is
begin
return to_date/PDate, PDateFormat/;
exception when others then
return null;
end;


Cela renvoie la date si elle peut vérifier que la date et le format des dates coïncident, sinon retourne NULL, S'il y a une erreur. Ensuite, votre demande sera la suivante:


select 'P' from dual where validate_date/'20140506', 'yyyymmdd'/ is not null

Daniel

Confirmation de:

Exemple:


^[12][0-9]{3}/0[1-9]|1[0-2]//0[1-9]|[12][0-9]|3[01]/$



https://www.debuggex.com/r/WyytEzoGZRuFKFFQ
Debuggex

WARNING

Ne pas utiliser pour cela regex, Comme cela transférera des valeurs non valides , tel que
20140229

,
20140431

etc. Vérifiez que la réponse est correcte. @Ben's.

Si vous voulez vérifier datetime Et vous ne pouvez pas créer de fonctions dans Oracle, comme une réponse @Ben's /N'ai pas access/privileges/

Ensuite, vous pouvez utiliser la requête suivante:


SELECT 'P'
FROM DUAL
WHERE REGEXP_LIKE /'20140229','^[12][0-9]{3}/0[1-9]|1[0-2]//0[1-9]|[12][0-9]|3[01]/$'/
AND '20140229' <= TO_CHAR/LAST_DAY/TO_DATE/SUBSTR/'20140229', 1, 6/ || '01', 'YYYYMMDD'//, 'YYYYMMDD'/;


Vous remplacez vraiment
20140229

Le nom de la colonne.

Pour répondre aux questions, connectez-vous ou registre