Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wspólna funkcja formatu daty dla Oracle-sql i Mysql

Po pierwsze, w MySQL daty mają zwykle następujący format, gdy są konwertowane niejawnie - 2015-01-16 - zamiast 20150116 . Myślę, że możesz wykonać następujące czynności zarówno w MySQL i Oracle (jest to standardowy SQL) - sprawdziłem to w Oracle (10g) i działa i wydaje się działać w mojej pracy z MySQL :

SELECT * FROM mytable
 WHERE mydate IN ( DATE '2015-01-16', DATE '2015-01-18' );

Literał ciągu, który ma zostać przekonwertowany na DATE, musi mieć postać yyyy-mm-dd . Teraz to zadziała, jeśli Twoje daty to daty i nie ma części czasu. Teraz, jeśli twoje daty mają część czasu, sprawy stają się trudniejsze, ponieważ MySQL używa DATE() funkcja, aby pobrać część daty, podczas gdy Oracle użyłoby TRUNC() . Ale możesz to obejść, rozsądnie używając >= i < , np.:

SELECT * FROM mytable
 WHERE ( mydate >= DATE '2015-01-16' AND mydate < DATE '2015-01-17' )
    OR ( mydate >= DATE '2015-01-18' AND mydate < DATE '2015-01-19' );

Teraz, jeśli chcesz użyć SYSDATE , najlepiej byłoby użyć standardu ANSI CURRENT_DATE lub CURRENT_TIMESTAMP . Można je porównać bezpośrednio bez potrzeby formatowania i powinny działać zarówno w MySQL, jak i Oracle. Możesz także wykonać arytmetykę dat za pomocą INTERVAL , w takim przypadku możesz spróbować następujących czynności:

SELECT * FROM mytable
 WHERE mydate > CURRENT_DATE - INTERVAL '1' DAY;

AKTUALIZUJ Myślałem o tym trochę. Zapytanie bezpośrednio powyżej nie działa, jeśli chcesz pobrać wszystkie wiersze, które zostały wprowadzone dzisiaj . Trudność polega na tym, że Oracle rozpoznaje literały daty ANSI jako daty (tzn. bez części czasowej), ale z tego, co wiem, nie ma standardowego sposobu konwersji daty/godziny wartość (która Oracle DATE jest) do daty . To powiedziawszy, zarówno Oracle, jak i MySQL obsługują funkcję EXTRACT(), więc powinieneś być w stanie wykonać następujące czynności, aby uzyskać dzisiaj rekordy:

SELECT * FROM mytable
 WHERE EXTRACT(YEAR FROM mydate) = EXTRACT(YEAR FROM CURRENT_DATE)
   AND EXTRACT(MONTH FROM mydate) = EXTRACT(MONTH FROM CURRENT_DATE)
   AND EXTRACT(DAY FROM mydate) = EXTRACT(DAY FROM CURRENT_DATE);

Zdecydowanie nieporęczny, zwłaszcza jeśli ktoś ma do rozważenia więcej niż jedną datę (co zakładam, że robisz, ponieważ używasz IN operatora), ale powinien działać na obu platformach. Zobacz demonstrację SQL Fiddle tutaj (MySQL) i tutaj (Oracle) .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Podejście Ajax do wypełniania drugiego dynamicznego menu rozwijanego na podstawie wyboru w pierwszym

  2. Laravel 5 UnexpectedValueException w odpowiedzi na zapytanie z powodu użycia danych POINT

  3. Aktualizowanie bazy danych z JavaScript przez wywołanie skryptu PHP

  4. Serwer Ruby on Rails nie uruchamia się:dyld:leniwe wiązanie symbolu nie powiodło się:Nie znaleziono symbolu:_mysql_get_client_info

  5. Priorytet operatora AND i OR w zapytaniu wybierającym Mysql