Общая функция формата даты для Oracle-sql и Mysql

Мне нужно написать общие запросы для баз данных MySQL и Oracle. Проблема возникает, когда мне приходится устанавливать условия даты. Например: существует одно поле Txn_date которое находится в формате '20150116' в MySQL и « '16-JAN-2015' в Oracle.

Я использую date_format(now(),'%Y%m%d') для MySQL и to_char(sysdate,'dd-MON-YYYY') для Oracle.

Есть ли какая-то общая функция, с помощью которой я могу использовать одну и ту же функцию в Oracle и MySQL?

Я попробовал Txn_date in ( date_format(now(),'%Y%m%d') OR to_char(sysdate,'dd-MON-YYYY') ) но не работал, потому что to_char() не распознан в 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' ); 

Строковый литерал, который должен быть преобразован в DATE, должен иметь форму 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 для преобразования значения даты / времени (которое Oracle DATE есть) до даты . Тем не менее, как 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) .

MySQL и Oracle используют другой синтаксис для преобразования дат в строки – вам придется использовать разные запросы.