Оператор 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
  1. Нет необходимости преобразовывать текстовые даты в значения дат, так как выбранный формат даты допускает простую сортировку строк.
  2. Для ваших таблиц можно выбрать «псевдоним», скажем, «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
Другие вопросы по тегам