2016-06-23 2 views
-2

Немного о проблеме с преобразованием SQL из SQL Server в Oracle.Конвертировать код SQL Server в Oracle, пожалуйста?

Мы передаем значение datetime (в этом примере только 1900-01-01), и нам нужно выбрать все строки с модифицированной датой больше, чем за 2 дня до сдачи даты. Вот синтаксис SQL, который работы:

SELECT * 
FROM TABLENAME 
WHERE CAST(LAST_MODIFIED AS DATE) > CAST(DATEADD(dd, -2, '1990-01-01') AS DATE); 

Где LAST_MODIFIED находится столбец, а '1900-01-01' представляет собой значение, впрыскивают в SQL-строку в C# перед его выполняется. Перед тем, как вас попросят, мы предпочитаем не вычитать 2 дня с даты, прежде чем передавать его на SQL :)

Итак, тогда нам нужен только этот запрос, преобразованный в синтаксис Oracle ... Мы попробовали пару вещей и он не :(

Спасибо,

Dave

ответ

4

Вы можете написать в Oracle, как:

SELECT * 
FROM TABLENAME 
WHERE TRUNC(LAST_MODIFIED) > (DATE '1990-01-01') - 2 

Примечания:

  • В Oracle, DATE i ncludes компонент времени, поэтому приведение к дате ничего не делает.
  • Oracle поддерживает различные способы включения константы даты/времени. Я предпочитаю ключевое слово DATE с стандартным форматом даты ISO/ANSI YYYY-MM-DD.
  • - 2, возможно, более точно написан как - interval '2' day. Тем не менее, нотация интервалов является новой (ish) для Oracle.

И это лучше в любой базе данных, чтобы написать это без изменения last_modified_date:

SELECT * 
FROM TABLENAME 
WHERE LAST_MODIFIED >= (DATE '1990-01-01') - 1 

Удаление компонента времени не требуется, с правом сравнения дат.

+0

Отлично, спасибо! –

1
SELECT * 
FROM TABLENAME 
WHERE CAST(LAST_MODIFIED AS DATE) > TO_DATE('1990-01-01','YYYY-MM-DD')-2; 
0
SELECT * 
FROM TABLENAME 
WHERE TRUNC(LAST_MODIFIED) > TO_DATE('1990-01-01', 'YYYY-MM-DD') - 2; 

или, если вы передаете значение при помощи переменной :date_value связывания:

SELECT * 
FROM TABLENAME 
WHERE TRUNC(LAST_MODIFIED) > :date_value - 2; 

Если значение, которое вы передаете, чтобы запрос не имеет компонент времени, то вы можете просто сделать:

SELECT * 
FROM TABLENAME 
WHERE LAST_MODIFIED >= :date_value - 1; 
Смежные вопросы