sql >> Databáze >  >> RDS >> Mysql

Společná funkce formátu data pro Oracle-sql a Mysql

Zaprvé, data v MySQL mají při implicitním převodu obvykle následující formát - 2015-01-16 - spíše než 20150116 . Myslím, že v MySQL a můžete udělat následující Oracle (je to standardní SQL) – zkontroloval jsem to v Oracle (10g) a funguje to a zdá se, že to funguje v mém hraní s MySQL :

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

Řetězcový literál, který se má převést na DATE, musí mít tvar yyyy-mm-dd . Nyní to bude fungovat, pokud jsou vaše data data a nemají časovou část. Nyní, pokud vaše data mají časovou část, věci se stanou obtížnějšími, protože MySQL používá DATE() k získání části data, zatímco Oracle by použil TRUNC() . Ale můžete to obejít rozumným používáním >= a < , např.:

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' );

Nyní, pokud chcete použít SYSDATE , nejlepší by bylo použít standard ANSI CURRENT_DATE nebo CURRENT_TIMESTAMP . Ty lze přímo porovnávat bez nutnosti formátování a měly by fungovat v MySQL i Oracle. Můžete také provést aritmetiku data pomocí INTERVAL , v takovém případě můžete zkusit následující:

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

AKTUALIZACE Nějak jsem o tom přemýšlel. Dotaz bezprostředně výše ve skutečnosti nefunguje, pokud chcete získat všechny zadané řádky dnes . Potíž je v tom, že Oracle rozpoznává datové literály ANSI jako data (tj. bez časové části), ale pokud vím, neexistuje standardní způsob převodu data/času hodnota (což je Oracle DATE je) k datu . To znamená, že Oracle i MySQL podporují funkci EXTRACT(), takže byste měli být schopni udělat následující, abyste získali dnes záznamy uživatele:

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);

Rozhodně nepraktické, zvláště pokud je třeba zvážit více než jedno datum (což předpokládám, že ano, protože používáte IN operátor), ale měl by fungovat na obou platformách. Podívejte se na ukázku SQL Fiddle zde (MySQL) a zde (Oracle) .



  1. MySQL select se zdá být velmi pomalý, ale nenapadá vás, jak to zlepšit?

  2. Jak CONV() funguje v MariaDB

  3. vložit výběrem hodnot ze dvou sloupců do sloupce ze stejné tabulky

  4. Existuje nějaký trik, který umožní MySQL ignorovat koncovou čárku v klauzuli SET příkazu UPDATE?