【问题标题】:Replacing Every date before a Certain Day with that Day SQL用那一天 SQL 替换某一天之前的每个日期
【发布时间】:2018-07-05 17:02:37
【问题描述】:
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 都在 2018 年 6 月 21 日之后,但我在 START_DATE 方面遇到了问题。我的目标是在 START_DATE 列中将 2018 年 6 月 22 日之前的每个日期都替换为 2018 年 6 月 22 日。

我尝试将“Trade Details 2”.START_DATE

【问题讨论】:

  • 您正在寻找 CASE 声明。而不是 If True Then DoSomething Else DoSomethingDifferent End If in SQL you do CASE WHEN condition = True THEN DoSomething ELSE DoSomethingDifferent END

标签: sql sqlite date


【解决方案1】:

你可以这样写查询,假设是 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()

【讨论】:

    【解决方案2】:

    参见 start_date_bounded。由于您没有标记您的 dbms,因此可能需要调整语法(例如 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 &lt; 2018-06-22 00:00:00 THEN 2018-06-22 ELSE "Trade Details 2".START_DATE,因为当我尝试时,我得到一个错误“接近 00”
    • 您能发布 DDL 和示例数据吗?开始日期是存储为字符串还是日期?
    • 这是在 DB Browser for SQLite 中,它似乎在一个字符串中。它写为 DD-MM-YYYY HH:MM:SS
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    相关资源
    最近更新 更多