У меня есть набор записей, который содержит столбец 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() 'вместо литерала даты? –
Вам требуется выражение case, а не case case. – jarlh
Это поможет показать вашу попытку выражения case, чтобы мы могли объяснить, что вы делаете неправильно. Это может быть так же просто, как неверное указание фиксированной даты, например. полагаясь на неявное преобразование; но также может быть полезно показать образцы данных (с полными датами). –
Я думаю, что моя проблема заключается в части сравнения даты. Каков правильный способ сравнить дату? Моя база данных - это Oracle. –