我正在尝试修复SQL表中的某些日期。就上下文而言,我将“交易明细”和“交易明细2”这两个表结合在一起。 “交易详细信息2”中的一列是“ START_DATE”,其日期可以追溯到2000年代初,格式为2010-05-08。我希望在2018年6月22日之前的每个START_DATE进入2018年6月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,但不确定如何执行
答案 0 :(得分:0)
首先,您的CASE
语句看起来不正确。
它应该类似于CASE WHEN condition THEN value ELSE value END
(请参阅SQLite Expressions)。
第二,因为SQLite does not have a "date" field type,您可能正在使用字符串,所以您需要将值转换为日期(请参见SQLite Date And Time Functions):
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/#!5/361ea/3/0