Mysql
 sql >> база данни >  >> RDS >> Mysql

Функция за общ формат на дата за Oracle-sql и Mysql

Първо, в MySQL датите обикновено имат следния формат, когато се преобразуват имплицитно - 2015-01-16 - вместо 20150116 . Мисля, че можете да направите следното както в MySQL и Oracle (той е стандартен SQL) - проверих го в Oracle (10g) и работи и изглежда работи в моята работа с MySQL :

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

Низовият литерал, който трябва да бъде преобразуван в ДАТА, трябва да бъде във формата yyyy-mm-dd . Сега това ще работи, ако вашите дати са дати и нямат част от времето. Сега, ако вашите дати имат времева част, тогава нещата стават по-трудни, тъй като MySQL използва DATE() функция за получаване на частта от датата, докато Oracle ще използва TRUNC() . Но можете да заобиколите това с разумно използване на >= и < , напр.:

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

Сега, ако искате да използвате SYSDATE , най-доброто нещо, което можете да направите, е да използвате стандарта ANSI CURRENT_DATE или CURRENT_TIMESTAMP . Те могат да се сравняват директно без нужда от форматиране и трябва да работят както в MySQL, така и в Oracle. Можете също така да правите аритметика с дати, като използвате INTERVAL , в който случай можете да опитате следното:

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

АКТУАЛИЗАЦИЯ Мислих малко за това. Заявката непосредствено по-горе всъщност не работи, ако искате да получите всички редове, които са въведени днес . Трудността е, че Oracle разпознава литералите за дата на ANSI като дати (т.е. без част от времето), но доколкото знам, няма стандартен ANSI начин за преобразуване на дата/час стойност (която е DATE на Oracle е) до дата . Въпреки това Oracle и MySQL поддържат функцията EXTRACT(), така че трябва да можете да направите следното, за да получите днес записи на:

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

Определено тромаво, особено ако има повече от една дата за разглеждане (което предполагам, че правите, тъй като използвате IN оператор), но трябва да работи и на двете платформи. Вижте демонстрация на SQL Fiddle тук (MySQL) и тук (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. Laravel вложени връзки

  2. SQL INSERT от SELECT

  3. Съвпадение на SQL при подреждане на букви и цифри

  4. Каква е разликата между наклонените черти на PHP и mysql(i)_escape_string?

  5. Как да предотвратим създаването на записи, където стойността на две полета е една и съща?