2016-11-18 8 views
-1

У меня есть набор записей, который содержит столбец Date1 и столбец Date2. Если запись имеет значение Date1 меньше определенной даты, то это значение будет заменено значением в столбце Date2 для этой записи. Столбцы Date имеют дату типа. Я пытаюсь использовать оператор CASE, но по какой-то причине я получаю новое значение для ВСЕХ записей.Подставляя значения даты в оператор CASE

+0

Вам требуется выражение case, а не case case. – jarlh

+1

Это поможет показать вашу попытку выражения case, чтобы мы могли объяснить, что вы делаете неправильно. Это может быть так же просто, как неверное указание фиксированной даты, например. полагаясь на неявное преобразование; но также может быть полезно показать образцы данных (с полными датами). –

+0

Я думаю, что моя проблема заключается в части сравнения даты. Каков правильный способ сравнить дату? Моя база данных - это Oracle. –

ответ

0

Что относительно нулей?

select case when date1 < date '2016-01-01' then date2 else date1 end as your_date 
    from your_table; 
0

Попробуйте что-нибудь в этом роде;

CASE 
    WHEN Date1 < @DateVariable 
     THEN Date2 
    ELSE Date1 
END DateResult 
+0

Помещение '@' перед переменной недействительно. Синтаксис Oracle. Используйте ':' для переменной привязки или '&' для переменной подстановки или, если это постоянное значение, просто используйте литерал даты ANSI. – MT0

+0

Это было просто заполнителем, чтобы показать, как это будет выглядеть. –

0

Допустим, у вас есть что конкретной даты в переменной, такие как:

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 

Надеюсь, это поможет !!!

+0

Помещение @ до имен переменных не будет работать в Oracle. – Boneist

+0

@ Бойнер, ты прав! Мой плохой, я написал его на SQL Server Management Studio, где это необходимо. Удалилось бы это, прежде чем вставлять сюда. Спасибо, что указали это.Соответственно изменили ответ. –

+0

'' 10/10/2016'' является строковым литералом, а не литералом даты. Oracle неявно попытается преобразовать это в дату с помощью параметра сеанса NLS_DATE_FORMAT, однако это настройка клиента и не гарантируется как статическая, так и согласованных между пользователями. Если вы хотите использовать литералы, тогда используйте литералы даты ANSI 'DATE '2016-10-10'' – MT0

0

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;

+0

. Как это отличается от того, что сказал Роннис несколько часов назад, - вместо использования' to_date() 'вместо литерала даты? –