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?


См. 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»
Не могли бы вы опубликовать DDL и образцы данных? Дата начала хранится в виде строки или даты?
Это находится в браузере БД для SQLite и, похоже, находится в строке. Он записывается как ДД-ММ-ГГГГ ЧЧ: ММ: СС
Вы можете написать такой запрос, предполагая, что 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.MIN() и MAX() принимают несколько аргументов. С несколькими аргументами они не являются функциями агрегирования, а ведут себя как LEAST() и GREATEST() в других базах данных.
Вы ищете оператор CASE. Вместо If True Then DoSomething Else DoSomethingDifferent End Если в SQL вы выполняете CASE WHEN condition = True THEN DoSomething ELSE DoSomethingDifferent END