Оператор Case для дат в запросе SQL
Я пытаюсь исправить некоторые даты, которые у меня есть в моей таблице SQL. Для контекста я соединил две таблицы: "Детали сделки" и "Детали сделки 2". Один из столбцов в "Сведениях о сделке 2" - это "START_DATE" с датами начала 2000-х годов в формате 2010-05-08. Я хочу сделать каждую START_DATE до 2018-06-22 до 2018-06-22. В настоящее время мой код ниже:
SELECT "Trade Details 2".Portfolio,
"Trade Details 2".CONTRACT_ID,
DATE("Trade Details 2".START_DATE) as START_DATE,
DATE(substr("Trade Details 2".MATURITY_DATE, 0, 5) || '-' || substr("Trade
Details 2".MATURITY_DATE, 5,2) || '-' || substr("Trade Details
2".MATURITY_DATE, 7, 9)) as MATURITY_DATE,
"Trade Details 2".NOTIONAL1,
"Trade Details 2".CONTRACT_NPV,
"Trade Details".TERM
FROM "Trade Details 2"
JOIN "Trade Details"
WHERE "Trade Details 2".CONTRACT_ID="Trade Details".FCC_ID and
("Trade Details 2".NOTIONAL1 > "0.0") and
("Trade Details 2".MATURITY_DATE > DATE(substr('20180602', 0, 5) || '-' ||
substr('20180602', 5,2) || '-' || substr('20180602', 7, 9)) )
ORDER BY CONTRACT_ID asc
Я считаю, что мне нужно утверждение CASE WHEN, где я говорю что-то вроде:
CASE WHEN "Trade Details 2".START_DATE<2018-06-22 THEN =2018-06-22
Однако, когда я попробовал это, я получил ошибку, и я предполагаю, что какая-то часть этой строки кода неверна. Однако, поскольку это дата, я не знаю, будет ли достаточно символа больше / меньше, и я не уверен, куда поместить это утверждение, или даже если это утверждение полностью верно. Тем не менее, это суть моего вопроса. Я верю, что это отличается от других вопросов здесь, потому что речь идет о датах, а не простых числах.
TLDR; Попытка преобразовать даты до 2018-06-22 в 2018-06-22, но не знаю, как это сделать
3 ответа
Во-первых, ваш CASE
утверждение не выглядит правильным. Это должно быть что-то вроде CASE WHEN condition THEN value ELSE value END
(см. выражения SQLite).
Во-вторых, поскольку SQLite не имеет типа поля "дата", вы, вероятно, используете строку, поэтому вам необходимо преобразовать свое значение в дату (см. Функции даты и времени в SQLite):
date(start_date)
Например, учитывая следующие упрощенные данные:
CREATE TABLE IF NOT EXISTS `trade_details` (
`id` INTEGER,
`start_date` TEXT,
PRIMARY KEY(`id`)
);
INSERT INTO `trade_details` VALUES
(1,'2018-06-01'),
(2,'2018-06-22'),
(3,'2018-06-23');
Следующий запрос должен работать:
SELECT
id,
start_date,
CASE
WHEN date(start_date) < date('2018-06-22')
THEN '2018-06-22'
ELSE start_date
END AS modified_date
FROM trade_details;
Результат:
+----+------------+---------------+
| id | start_date | modified_date |
+----+------------+---------------+
| 1 | 2018-06-01 | 2018-06-22 |
| 2 | 2018-06-22 | 2018-06-22 |
| 3 | 2018-06-23 | 2018-06-23 |
+----+------------+---------------+
Вы также можете попробовать поиграть с этим скриптом SQL: http://sqlfiddle.com/
Это старый вопрос, но я подумал, что могу предложить кое-что просто для вашего кода.
SELECT
td2.Portfolio,
td2.CONTRACT_ID,
td2.NOTIONAL1,td2.CONTRACT_NPV, td.TERM,
CASE WHEN td2.START_DATE < '2018-06-02'
THEN '2018-06-02'
ELSE td2.START_DATE AS START_DATE
FROM "Trade Details 2" td2
JOIN "Trade Details" td
WHERE td2.CONTRACT_ID=td.FCC_ID AND (td2.NOTIONAL1 > "0.0")
ORDER BY CONTRACT_ID ASC
- Нет необходимости преобразовывать текстовые даты в значения дат, так как выбранный формат даты допускает простую сортировку строк.
- Для ваших таблиц можно выбрать «псевдоним», скажем, «td» и «td2». Это позволит убрать много беспорядка.
Надеюсь, это кому-нибудь пригодится.
Я смог разобраться. См. ниже.
select *
,case when 2015 >= year(startdate) and 2015 <= year(enddate) then 'yes' end as '2015'
,case when 2016 >= year(startdate) and 2016 <= year(enddate) then 'yes' end as '2016'
,case when 2017 >= year(startdate) and 2017 <= year(enddate) then 'yes' end as '2017'
,case when 2018 >= year(startdate) and 2018 <= year(enddate) then 'yes' end as '2018'
,case when 2019 >= year(startdate) and 2019 <= year(enddate) then 'yes' end as '2019'
,case when 2020 >= year(startdate) and 2020 <= year(enddate) then 'yes' end as '2020'
,case when 2021 >= year(startdate) and 2021 <= year(enddate) then 'yes' end as '2021'
,case when 2022 >= year(startdate) and 2022 <= year(enddate) then 'yes' end as '2022'
from #Have
order by ID