Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite查询是否要在一个日期范围内加入?_Sql_Datetime_Sqlite - Fatal编程技术网

SQLite查询是否要在一个日期范围内加入?

SQLite查询是否要在一个日期范围内加入?,sql,datetime,sqlite,Sql,Datetime,Sqlite,我正在与SQLite合作 假设我有一个销售表,有两列,日期和计数,用来记录那天我卖了多少杯柠檬水。如果我在某一天不卖柠檬水,我就太沮丧了,无法在销售表中创建新的一行 我想知道在给定的日期范围内平均售出的眼镜数量。我可以发出如下查询: SELECT AVG(count) FROM sales WHERE date IS BETWEEN '2010-01-04' AND '2010-01-10'; SELECT sum(count) / ((strftime('%s','2010-01-10')-

我正在与SQLite合作

假设我有一个销售表,有两列,日期和计数,用来记录那天我卖了多少杯柠檬水。如果我在某一天不卖柠檬水,我就太沮丧了,无法在销售表中创建新的一行

我想知道在给定的日期范围内平均售出的眼镜数量。我可以发出如下查询:

SELECT AVG(count) FROM sales WHERE date IS BETWEEN '2010-01-04' AND '2010-01-10';
SELECT sum(count) / ((strftime('%s','2010-01-10')-strftime('%s','2010-01-04')+86400)/86400)
FROM sales
WHERE date IS BETWEEN '2010-01-04' AND '2010-01-10';
但是,除非该范围内的所有日期都包含在表中,否则结果不会准确。我需要一些方法来告诉SQLite将丢失的行计算为零

我想,如果我能加入销售表的日期范围,那将是理想的。这似乎是不可能的,因此从日期范围创建表的简单方法可能是下一个最好的方法。我不想修改销售表,这对于柠檬水摊来说似乎很愚蠢,但在现实生活中更有意义


正如我上面所说的,我使用的是SQLite,所以如果你向我推荐其他数据库,你就没有什么帮助了。也就是说,如果您对另一个数据库有更多的经验,并且认为您的解决方案可以用香草SQL完成,我很乐意听您这么说。

创建一个日历表并加入其中:

这样做可以:

create table dates (id integer primary key);
insert into dates default values;
insert into dates default values;
insert into dates select null from dates d1, dates d2, dates d3 , dates d4;
insert into dates select null from dates d1, dates d2, dates d3 , dates d4;
alter table dates add date datetime;
update dates set date=date('2000-01-01',(-1+id)||' day');
到2287-05-20为止 将索引添加到dates表中的date列不会有任何影响。我的sqlite有点生锈,所以我建议你咨询一下

编辑:索引的代码:

create unique index ux_dates_date on dates (date);

创建一个日历表并加入其中:

这样做可以:

create table dates (id integer primary key);
insert into dates default values;
insert into dates default values;
insert into dates select null from dates d1, dates d2, dates d3 , dates d4;
insert into dates select null from dates d1, dates d2, dates d3 , dates d4;
alter table dates add date datetime;
update dates set date=date('2000-01-01',(-1+id)||' day');
到2287-05-20为止 将索引添加到dates表中的date列不会有任何影响。我的sqlite有点生锈,所以我建议你咨询一下

编辑:索引的代码:

create unique index ux_dates_date on dates (date);

我想你需要这样的东西:

SELECT AVG(count) FROM sales WHERE date IS BETWEEN '2010-01-04' AND '2010-01-10';
SELECT sum(count) / ((strftime('%s','2010-01-10')-strftime('%s','2010-01-04')+86400)/86400)
FROM sales
WHERE date IS BETWEEN '2010-01-04' AND '2010-01-10';
查询通过计算给定日期之间的秒数来计算确切天数 除以86400=24*3600秒

比如说

SELECT (strftime('%s','2010-03-01')-strftime('%s','2010-01-01') + 86400) / 86400
输出60,这是正确的值


查看SQLite的

我认为您需要这样的东西:

SELECT AVG(count) FROM sales WHERE date IS BETWEEN '2010-01-04' AND '2010-01-10';
SELECT sum(count) / ((strftime('%s','2010-01-10')-strftime('%s','2010-01-04')+86400)/86400)
FROM sales
WHERE date IS BETWEEN '2010-01-04' AND '2010-01-10';
查询通过计算给定日期之间的秒数来计算确切天数 除以86400=24*3600秒

比如说

SELECT (strftime('%s','2010-03-01')-strftime('%s','2010-01-01') + 86400) / 86400
输出60,这是正确的值


查看SQLite的

您可以使用递归公共表表达式来生成一系列日期并将其联接:

WITH RECURSIVE
  cnt(x) AS (
    SELECT 0
    UNION ALL
    SELECT x+1 FROM cnt
    LIMIT (SELECT ((julianday('2010-01-10') - julianday('2010-01-04'))) + 1)
), 
WITH date_series AS (
  SELECT date(julianday('2010-01-04'), '+' || x || ' days') as date 
FROM date_series ds
)
SELECT AVG(COALESCE(s.count, 0)) as avg_sales_count
FROM date_series ds
  LEFT JOIN sales s ON ds.date = s.date

我在这里写了一篇博文,提供了更多信息:

您可以使用递归公共表表达式来生成一系列日期并加入其中:

WITH RECURSIVE
  cnt(x) AS (
    SELECT 0
    UNION ALL
    SELECT x+1 FROM cnt
    LIMIT (SELECT ((julianday('2010-01-10') - julianday('2010-01-04'))) + 1)
), 
WITH date_series AS (
  SELECT date(julianday('2010-01-04'), '+' || x || ' days') as date 
FROM date_series ds
)
SELECT AVG(COALESCE(s.count, 0)) as avg_sales_count
FROM date_series ds
  LEFT JOIN sales s ON ds.date = s.date

我在这里写了一篇博文,提供了更多信息:

你能谈谈这个范围吗?它应该是任意长度吗?或者有最大值吗?你能说说范围吗?它应该是任意长度吗?还是有上限?聪明!我想的东西太复杂了。这很好,但它只适用于计算平均值。我想做一些更复杂的事情,但这还不够。聪明!我想的东西太复杂了。这很好,但它只适用于计算平均值。我想做一些更复杂的事情,但这还不够。