Замена каждой даты перед определенным днем ​​на SQL этого дня

SELECT 
    "Trade Details 2".Portfolio, 
    "Trade Details 2".CONTRACT_ID, 
    "Trade Details 2".START_DATE, 
    "Trade Details 2".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 > "20180621")
ORDER BY 
    CONTRACT_ID asc

Мне удалось убедиться, что каждый Maturity_Date наступает после 21 июня 2018 г., но у меня проблемы с START_DATE. Моя цель - заменить каждую дату до 22 июня 2018 г. на 22 июня 2018 г. в столбце START_DATE.

Я попытался заменить "Trade Details 2" .START_DATE <2018-06-22 WITH 2018-06-22), но безрезультатно. Есть ли способ сделать это в SQL?

Вы ищете оператор CASE. Вместо If True Then DoSomething Else DoSomethingDifferent End Если в SQL вы выполняете CASE WHEN condition = True THEN DoSomething ELSE DoSomethingDifferent END

Error_2646 05.07.2018 19:07
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
26
2

Ответы 2

См. Start_date_bounded. Поскольку вы не пометили свои базы данных, возможно, потребуется изменить синтаксис (например, DATE '2018-06-22'.

SELECT "Trade Details 2".Portfolio, "Trade Details 2".CONTRACT_ID, 
CASE WHEN "Trade Details 2".START_DATE < 2018-06-22 THEN 2018-06-22
     ELSE "Trade Details 2".START_DATE
 END AS start_date_bounded, "Trade Details 2".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 > "20180621")

ORDER BY CONTRACT_ID asc

Пытался, и ошибок не было, но ни одна из дат начала не изменилась. Может ли это иметь какое-то отношение к тому факту, что все даты начала - это дата и время, поэтому мне нужно было бы сделать CASE WHEN "Trade Details 2".START_DATE < 2018-06-22 00:00:00 THEN 2018-06-22 ELSE "Trade Details 2".START_DATE, потому что, когда я пытаюсь это сделать, я получаю ошибку «около 00»

throway172 05.07.2018 19:25

Не могли бы вы опубликовать DDL и образцы данных? Дата начала хранится в виде строки или даты?

Error_2646 05.07.2018 19:33

Это находится в браузере БД для SQLite и, похоже, находится в строке. Он записывается как ДД-ММ-ГГГГ ЧЧ: ММ: СС

throway172 05.07.2018 20:12

Вы можете написать такой запрос, предполагая, что SQLite:

SELECT td2.Portfolio, td2.CONTRACT_ID, 
       MAX(td2.START_DATE, '2018-06-22') as START_DATE
       td2.MATURITY_DATE, td2.NOTIONAL1, td2.CONTRACT_NPV, 
       td.TERM
FROM "Trade Details 2" td2 JOIN 
     "Trade Details" td
     ON td2.CONTRACT_ID = td.FCC_ID AND
        td2.NOTIONAL1 > 0.0 AND
        td2.MATURITY_DATE > '20180621'
ORDER BY  CONTRACT_ID asc;

Заметки:

  • Псевдонимы таблиц упрощают написание и чтение запросов.
  • Предположительно, NOTIONAL1 - это число, поэтому сравнивайте его с числом, а не строкой.
  • JOIN - хороший синтаксис. Всегда должен быть пункт ON.
  • В SQLite MIN() и MAX() принимают несколько аргументов. С несколькими аргументами они не являются функциями агрегирования, а ведут себя как LEAST() и GREATEST() в других базах данных.

Другие вопросы по теме