Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Porównanie daty i czasu SQL z podwójnej tabeli

Dobra, myślę, że cię mam. Chcesz wykonać następujące czynności?

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

Dość niezwykłe jest dbanie o milisekundy, ale jeśli to zrobisz, powinieneś użyć systimestamp .

Sądząc po tym, że podzieliłeś datę i godzinę, są to znaki, więc będę musiał odgadnąć maski formatu . Jeśli się mylą, link powinien wskazać Ci, co zrobić. Nawiasem mówiąc, dzielenie daty w ten sposób nie jest mądre. Możesz utworzyć kolumnę, używając sygnatury czasowej typ danych w Twojej tabeli, co sprawiłoby, że Twój problem byłby niezwykle prosty.

Tak więc nie wiem, dlaczego wybrałeś 'Dzień' format zapytania, ale idąc z tym staje się to_char(sysdate, 'DAY') .

Z twojego komentarza poniżej byłoby to_char(sysdate, 'DD-MON-RR')

będzie na_znak(sygnatura czasowa,'HH24:MI:SS:FF3') , co dałoby sygnaturę czasową z dokładnością do milisekundy, chociaż typ danych może być z dokładnością do mikrosekundy.

Wydaje mi się to trochę dziwne, ale twoje pytanie brzmi:

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

Bardziej normalne byłoby przechowywanie daty jako ciągu znaków w formacie rrrrmmdd więc przynajmniej możesz zagwarantować, że jest w porządku. Jeśli zrobiłeś coś takiego, po prostu zmień maskę formatu. Jeśli nie, te zapytania nie będą działać zgodnie z przeznaczeniem.

Osobiście, jeśli masz przechowywać dane w ten sposób i zakładając state_date jest przechowywany jako, powiedzmy, dd-mon-yy , czyli w tym rok, miesiąc ORAZ dzień i state_time jest przechowywany jak wskazano powyżej, wtedy zrobiłbym coś takiego:

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

To sprawia, że ​​o wiele bardziej oczywiste jest, co się dzieje i nie ma dwuznaczności co do tego, co < oznacza w tej sytuacji, że data zawsze będzie mniejsza niż data przyszła, co niekoniecznie musi być prawdziwe dla łańcuchów.

Mam nadzieję, że to ma sens.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę wydać pojedyncze polecenie z wiersza poleceń poprzez sql plus?

  2. Czy mogę używać wielowątkowości z Perl's DBI i Oracle?

  3. Maksymalna długość znaku UUID

  4. Jak dodać numer kolejny dla każdego elementu w grupie za pomocą zapytania SQL bez tabel tymczasowych

  5. Koncepcja:Zbuduj program Java i załaduj go do bazy danych Oracle - funkcja Wrapper wywołuje funkcję java ze zwrotem