【问题标题】:SQLite calculating difference of date got incorrect resultSQLite计算日期差异得到不正确的结果
【发布时间】:2021-01-14 03:24:59
【问题描述】:

我在 SQLite 中计算日期差异时遇到问题。
我在设置表格时将值类型设置为时间戳,但日期的计算似乎只适用于我的日期条目的第一个数字。
我尝试使用 to_date('01/01/2020', 'mm/dd/yyyy') 但它返回错误说不支持 to_date。我的代码如下,任何建议将不胜感激。

CREATE TABLE customer_join 
(
id INT,
country_code VARCHAR(10),
country_descrip VARCHAR(255),
register_date TIMESTAMP,
customer_id INT,
PRIMARY KEY (id),
FOREIGN KEY (customer_id) REFERENCES customer(id)
);

CREATE TABLE customer_order 
(
id INT,
item_name VARCHAR(25),
item_description VARCHAR(255),
number FLOAT(24),
order_date TIMESTAMP,
customer_id        INT,
PRIMARY KEY (id),
FOREIGN KEY (customer_id) REFERENCES patient(id)
);

INSERT INTO customer_join
Values (1,  1,  'none', '1/22/2017',    100),
        (2, 1,  'none', '1/23/2017',    101),
        (3, 1,  'none', '1/24/2017',    102),
        (4, 1,  'none', '1/25/2017',    103),
        (5, 1,  'none', '1/26/2017',    104),
        (6, 2,  'none', '1/27/2017',    101),
        (7, 2,  'none', '1/28/2017',    106),
        (8, 1,  'none', '1/29/2017',    107);
INSERT INTO customer_order
Values (1, 'A', 'none', 1, '2/23/2020', 101),
        (2, 'B', 'none', 1, '3/11/2027', 100),
        (3, 'B, C, D', 'none', 1, '4/10/2023', 100),
        (4, 'B, C, E', 'none', 1, '4/11/2020', 100),
        (5, 'R', 'none',1, '4/12/2099', 102);
SELECT (order_date - register_date) TIME_TO_ORDER
    FROM customer_join cj
    INNER JOIN 
        (SELECT customer_id , MIN(order_date) order_date
            FROM customer_order 
            GROUP BY customer_id) co 
    ON cj.customer_id = co.customer_id;

代码给了我结果:

    TIME_TO_ORDER
    2
    1
    3
    1

这不是我想要的。我试图弄清楚客户下第一个订单需要多长时间。有什么建议吗?

【问题讨论】:

  • 你想要什么?不清楚。
  • 请同时包含您的期望输出,但 MCVE 的新人值得一票...
  • 我已经对您的帖子进行了一些修改,包括删除了我(我相信至少@T.Peter)认为不需要的部分。认为这是一种恭维。

标签: sql sqlite


【解决方案1】:

首先,您必须将两个表中的日期格式更改为 YYYY-MM-DD,这是 SQLite 唯一有效的文本日期格式。
然后使用函数julianday() 获取日期之间的天数差:

SELECT cj.customer_id, 
       julianday(co.order_date) - julianday(cj.register_date) TIME_TO_ORDER
FROM customer_join cj 
INNER JOIN (
  SELECT customer_id , MIN(order_date) order_date
  FROM customer_order 
  GROUP BY customer_id
) co ON cj.customer_id = co.customer_id;

请参阅demo
结果:

customer_id | TIME_TO_ORDER
----------: | ------------:
        100 |          1175
        101 |          1126
        102 |         30028

【讨论】:

  • 请说明您如何解决问题,例如select julianday("10/11/2000");yields 没有输出。我不明白。我确实看到您没有使用 OP 提供的 MRE。
  • @Yunnosch 我在回答中提到,对于 SQLite,只有格式 YYYY-MM-DD 是有效的。 julianday() 不适用于其他格式。
  • 但这是否意味着“对于与您拥有的数据库不同的数据库,这就是解决方案......”?请至少讨论如何更改数据库以匹配。理想情况下,将解决方案更改为在 OPs 数据库上工作。
  • @Yunnosch 你说的对于一个不同于你的数据库是什么意思?数据库是 SQLite。对于 SQLite 有一个限制:日期必须具有正确的格式。是不是很难理解?
  • OK, "对于不同的数据库结构,具有不同语义/语法的列,特别是日期列,......"。
猜你喜欢
  • 1970-01-01
  • 2022-08-14
  • 2022-08-14
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多