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

Comparaison de date et d'heure SQL à partir d'une table double

OK, je pense que je t'ai eu. Vous voulez faire ce qui suit ?

select <columns>
  from my_table
 where state_date <= <some date>
   and state_time <= <some time>

Il est assez inhabituel de se soucier des millisecondes, mais si vous le faites, vous devez utiliser systimestamp .

À en juger par le fait que vous avez divisé la date et l'heure, ce sont des caractères, donc, je vais devoir deviner le masques de format . S'ils se trompent, le lien devrait vous guider sur ce qu'il faut faire. Il n'est pas sage, soit dit en passant, de diviser une date de cette façon. Vous pouvez créer une colonne en utilisant le timestamp type de données dans votre table, ce qui rendrait votre problème extrêmement simple.

Donc, je ne sais pas pourquoi vous avez choisi le 'Day' format pour votre requête mais avec ce <some date> devient to_char(sysdate, 'DAY') .

D'après votre commentaire ci-dessous <some date> serait to_char(sysdate, 'DD-MON-YY')

<some time> serait to_char(systimestamp,'HH24:MI:SS:FF3') , ce qui vous donnerait l'horodatage à la milliseconde, bien que le type de données puisse aller à la microseconde.

Cela me semble un peu étrange mais votre requête deviendrait alors :

select <columns>
  from my_table
 where state_date <= to_char(sysdate, 'DD-MON-YY')
   and state_time <= to_char(systimestamp,'HH24:MI:SS:FF3')

Il serait plus normal, si vous stockez une date sous forme de chaîne, de la stocker au format yyyymmdd donc au moins vous pouvez garantir qu'il est en ordre. Si vous avez fait quelque chose comme ça, changez simplement le masque de format. Si ce n'est pas le cas, ces requêtes ne fonctionneront pas comme prévu.

Personnellement, si vous avez pour stocker les données de cette façon et en supposant state_date est stocké sous, par exemple, dd-mon-yy , c'est-à-dire y compris l'année, le mois ET le jour et state_time est stocké comme indiqué ci-dessus, alors je ferais quelque chose comme ceci :

select <columns>
  from my_table
 where to_timestamp(state_date || state_time, 'DD-MON-YYHH24:MI:SS:FF3')
        <= systimestamp

Cela rend beaucoup plus évident ce qui se passe et il n'y a aucune ambiguïté sur ce que < signifie que dans cette situation, une date sera toujours inférieure à une date future, ce qui n'est pas nécessairement vrai pour les chaînes.

J'espère que cela a du sens.