2015-09-14 2 views
2

как название указывает на то, что я пытаюсь сделать единообразного запрос, который имеет совместимый синтаксис для Oracle SQL и для SQL ServerРавномерное SQL Дата в Oracle SQL и SQL Server

Текущий синтаксис у меня написано в Oracle и является:

SELECT * 
FROM TableA 
WHERE CREATION_DATE = TO_DATE('12-09-2015', 'DD-MM-YYYY') 

Когда я пытаюсь построить это на SQL Server, это не сработает. Синтаксис SQL Server является

SELECT * 
FROM TableA 
WHERE OrderDate='12-09-2015' 

Но это не работает в Oracle SQL ...

Так что равномерный способ написать это?

+2

Есть ли причина, по которой вы хотели бы использовать литералы в первую очередь? Вместо использования переменных связывания, чтобы вы могли использовать любой класс 'date' на любом языке, на котором вы строите свое приложение? –

+0

+1 для предложения Джастина Кейв. Гораздо безопаснее использовать параметризованные запросы с параметрами, заданными по дате, а также не только для того, чтобы избежать локализации, но и по соображениям безопасности и производительности. BTW в SQL Server - это формат YYYYMMDD. –

+0

Переменные привязки лучше всего, когда их можно использовать, но это не всегда. Иногда вам нужны жестко закодированные даты для кодирования бизнес-правил, например. налоговые ставки изменяются на определенную дату, как рассчитывается какой-то идентификатор или ссылочный номер, в зависимости от даты. – Ben

ответ

1

Используйте это для чего-то, который работает на обоих:

CAST('2015-09-14' as date) 

Бросок выполняется только один раз, так не оказывает никакого влияния на производительность.

+0

Действительно, это сработало! – Jonas

+0

@Guil: Тогда вам повезло. Он не работает в Oracle, если вы не используете некоторые региональные настройки, где «2015-09-14» является принятым представлением даты. Это определенно не работает на моей машине, установленной на немецком языке. (Я получаю ORA-01861.) –

+0

@ThorstenKettner, ничего себе. Я этого не понимал. – Ben

2

Я не уверен, поддерживает ли SQL Server ANSI DATE литерал, но он поддерживается в Oracle. Формат строкового литерала по умолчанию: ГГГГ-ММ-ДД.

DATE '2015-09-12' 

поэтому, если стандарт ANSI также поддерживается на SQL Server, используйте его. Это просто.

Основываясь на этом link, я думаю, вы могли бы использовать вышеизложенное в обеих базах данных.

WHERE OrderDate='12-09-2015'

Никогда не делайте этого. Вы сравниваете DATE с STRING, вам может быть просто повезло получить правильные данные в зависимости от ваших местных настроек NLS. Но никогда не полагайтесь на преобразование неявного типа данных .

+0

Я пробовал, и он работал на Oracle, но на SQL Server я получаю: Ошибка: неправильный синтаксис около «2015-09-12». SQLState: S0001 ErrorCode: 102 – Jonas

+0

SqlServer использует YYYYMMDD, т. Е. '20150912' – adrianm

+0

Не уверен, что это правильно даже для Oracle. SQL Server понимает формат * full * datetime ISO, т. Е. Включает элемент времени. Согласно [Википедии] (https://en.wikipedia.org/wiki/Calendar_date#Gregorian.2C_year-day-month_.28YDM.29), Казахстан по-прежнему использует формат YDM. Возможно, обе базы данных могут столкнуться с проблемами со старыми клиентами –