У меня есть набор записей, который содержит столбец Date1 и столбец Date2. Если запись имеет значение Date1 меньше определенной даты, то это значение будет заменено значением в столбце Date2 для этой записи. Столбцы Date имеют дату типа. Я пытаюсь использовать оператор CASE, но по какой-то причине я получаю новое значение для ВСЕХ записей.Подставляя значения даты в оператор CASE
ответ
Что относительно нулей?
select case when date1 < date '2016-01-01' then date2 else date1 end as your_date
from your_table;
Попробуйте что-нибудь в этом роде;
CASE
WHEN Date1 < @DateVariable
THEN Date2
ELSE Date1
END DateResult
Помещение '@' перед переменной недействительно. Синтаксис Oracle. Используйте ':' для переменной привязки или '&' для переменной подстановки или, если это постоянное значение, просто используйте литерал даты ANSI. – MT0
Это было просто заполнителем, чтобы показать, как это будет выглядеть. –
Допустим, у вас есть что конкретной даты в переменной, такие как:
DELCARE particularDate DATE
SET particularDate = '6/10/2016'
И у вас есть таблица, такие как:
CREATE TABLE Tab(ID INT, Name NVARCHAR(100), Date1 DATE, Date2 DATE)
INSERT INTO Tab VALUES(1, 'A', '10/10/2016', '11/10/2016')
INSERT INTO Tab VALUES(2, 'B', '9/10/2016', '12/16/2016')
INSERT INTO Tab VALUES(3, 'C', '1/10/2016', '11/10/2016')
INSERT INTO Tab VALUES(4, 'D', '2/10/2016', '4/10/2016')
INSERT INTO Tab VALUES(5, 'E', '4/10/2016', '2/10/2016')
таблица будет выглядеть следующим образом:
ID Name Date1 Date2
1 A 2016-10-10 2016-11-10
2 B 2016-09-10 2016-12-16
3 C 2016-01-10 2016-11-10
4 D 2016-02-10 2016-04-10
5 E 2016-04-10 2016-02-10
Затем вы можете использовать следующий запрос:
SELECT t.ID,
t.Name,
CASE
WHEN (t.Date1 < particularDate)
THEN t.Date2
ELSE t.Date1
END AS GreaterDate
FROM Tab t
Это даст вам следующий результат:
ID Name GreaterDate
1 A 2016-10-10
2 B 2016-09-10
3 C 2016-11-10
4 D 2016-04-10
5 E 2016-02-10
Было бы полезно, если бы вы указать, что должно произойти в случае Date1
и конкретной даты равны. Затем вы можете явно определить результат этого условия. Вы можете сделать что-то вроде этого:
SELECT t.ID,
t.Name,
CASE
WHEN (t.Date1 < particularDate) THEN t.Date2
WHEN (t.Date1 > particularDate) THEN t.Date1
ELSE t.Date1 --when date1 and particularDate are equal
END AS GreaterDate
FROM Tab t
Надеюсь, это поможет !!!
Помещение @ до имен переменных не будет работать в Oracle. – Boneist
@ Бойнер, ты прав! Мой плохой, я написал его на SQL Server Management Studio, где это необходимо. Удалилось бы это, прежде чем вставлять сюда. Спасибо, что указали это.Соответственно изменили ответ. –
'' 10/10/2016'' является строковым литералом, а не литералом даты. Oracle неявно попытается преобразовать это в дату с помощью параметра сеанса NLS_DATE_FORMAT, однако это настройка клиента и не гарантируется как статическая, так и согласованных между пользователями. Если вы хотите использовать литералы, тогда используйте литералы даты ANSI 'DATE '2016-10-10'' – MT0
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24: MI: SS';
ВЫБОР случае, когда DATE1 < TO_DATE ('1900/01/02 00:00:00', 'ГГГГ/ММ/ДД HH24: MI: SS') ТОГДА DATE2 ИНАЧЕ DATE1 КОНЕЦ КАК DATE_OF_INTEREST FROM TABLE;
. Как это отличается от того, что сказал Роннис несколько часов назад, - вместо использования' to_date() 'вместо литерала даты? –
- 1. Оператор SQL Case возвращает значения
- 2. NamedParameterJdbcTemplate не подставляя значения?
- 3. Подставляя значения в sql-соединение
- 4. Оператор case не должен возвращать нулевые значения
- 5. Оператор case в verilog
- 6. Оператор CASE в обновлении
- 7. Вставка значений в оператор CASE
- 8. Подставляя значения в массиве для одной ячейки
- 9. Подставляя числовые значения в символический Maple Vector
- 10. Подставляя значения из одной таблицы в другую
- 11. Оператор CASE, деленный на другой оператор CASE, дает значение 0
- 12. Подставляя NULLS
- 13. TSQL - Case - Значения в?
- 14. Перезапустите оператор case switch
- 15. Как поставить оператор case case внутри цикла foreach в php?
- 16. Как назвать оператор CASE
- 17. Оператор case для поля даты с Mysql db
- 18. Оператор case switch
- 19. Когда вычисляется оператор CASE?
- 20. Оператор switch/case
- 21. Вложенный оператор «CASE when»
- 22. Оператор CASE не работает
- 23. Оператор CASE с GETDATE()
- 24. SQL-вложенный оператор CASE
- 25. DATEDIFF/Case оператор
- 26. Вложенный оператор CASE WHEN
- 27. Оператор CASE в Oracle sql
- 28. Динамический оператор case в bash
- 29. Используя оператор Case в выберите
- 30. Оператор case HQL в подзапросе
Вам требуется выражение case, а не case case. – jarlh
Это поможет показать вашу попытку выражения case, чтобы мы могли объяснить, что вы делаете неправильно. Это может быть так же просто, как неверное указание фиксированной даты, например. полагаясь на неявное преобразование; но также может быть полезно показать образцы данных (с полными датами). –
Я думаю, что моя проблема заключается в части сравнения даты. Каков правильный способ сравнить дату? Моя база данных - это Oracle. –