Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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
Sql 开始日期&;generate_series()中表的结束日期_Sql_Postgresql_Generate Series - Fatal编程技术网

Sql 开始日期&;generate_series()中表的结束日期

Sql 开始日期&;generate_series()中表的结束日期,sql,postgresql,generate-series,Sql,Postgresql,Generate Series,我试图在PostgreSQL中计算某个日期范围之间的工作日 SELECT SUM(CASE WHEN extract (dow FROM foo) IN(1,2,3,4,5) THEN 1 ELSE 0 END) FROM (SELECT ('2007-04-01'::date + (generate_series(0,'2007-04-30'::date - '2007-04-01'::date)||'days')::interval) AS foo) foo 我想从名

我试图在PostgreSQL中计算某个日期范围之间的工作日

SELECT 
     SUM(CASE WHEN extract (dow FROM foo) IN(1,2,3,4,5) THEN 1 ELSE 0 
END) 
FROM (SELECT ('2007-04-01'::date + 
(generate_series(0,'2007-04-30'::date 
 - '2007-04-01'::date)||'days')::interval) AS foo) foo
我想从名为
myTable
的表中将日期替换为
start\u date
end\u date
开始日期
结束日期
格式为
yyyy-mm-dd

实际上,我需要它显示每行的工作日日期差异

|start_date |end_date |
------------------------
|2018-04-01 |2018-04-30| 
|2018-05-01 |2018-05-30| 
这是我的代码:

  SELECT pto.start_date, pto.end_date, 
  SUM(CASE WHEN extract (dow FROM foo) IN(1,2,3,4,5) THEN 1 ELSE 0 END) as theDIFF 
  FROM (
  SELECT start_date, (start_date::date + 
  (generate_series(0,end_date::date 
    - start_date::date)||'days')::interval) AS foo
  FROM pto
  ) foo inner join pto pto
  on pto.start_date = foo.start_date 
  group by pto.start_date, pto.end_date
我的输出:

  |start_date(date)| end_date(date) |theDiff(integer)
  ---------------------------------------------------
  |2017-06-01      |  2017-06-01    |        29     |
  |2017-05-29      |  2017-06-02    |        12     |
  ---------------------------------------------------
预期产出:

  |start_date(date)| end_date(date) |theDiff(integer)
  ---------------------------------------------------
  |2017-06-01      |  2017-06-01    |        1      |
  |2017-05-29      |  2017-06-02    |        5      |
  ---------------------------------------------------

您的示例代码有点混乱,因此仅考虑工作日和表,这将给出预期的输出:

CREATE TABLE myTable (start_date date, end_date date);

INSERT INTO myTable VALUES('2017-06-01', '2017-06-01'),('2017-05-29', '2017-06-02');

SELECT start_date, end_date,
       SUM(CASE WHEN EXTRACT(dow FROM days) BETWEEN 1 AND 5 THEN 1 ELSE 0 END)
  FROM myTable
 CROSS JOIN LATERAL generate_series(start_date, end_date, interval '1 day') AS days
 GROUP BY start_date, end_date;
它将生成行,每个行都有开始日期、结束日期以及它们之间的一天。然后,它将通过开始日期、结束日期以及星期一到星期五(星期一到星期五)之间的SUM()日期进行更改

如果没有聚合,它看起来是这样的:

 start_date |  end_date  |          days          | dow
------------+------------+------------------------+-----
 2017-06-01 | 2017-06-01 | 2017-06-01 00:00:00+02 |   4
 2017-05-29 | 2017-06-02 | 2017-05-29 00:00:00+02 |   1
 2017-05-29 | 2017-06-02 | 2017-05-30 00:00:00+02 |   2
 2017-05-29 | 2017-06-02 | 2017-05-31 00:00:00+02 |   3
 2017-05-29 | 2017-06-02 | 2017-06-01 00:00:00+02 |   4
 2017-05-29 | 2017-06-02 | 2017-06-02 00:00:00+02 |   5
分组方式:

 start_date |  end_date  | sum
------------+------------+-----
 2017-06-01 | 2017-06-01 |   1
 2017-05-29 | 2017-06-02 |   5

您的示例代码有点混乱,因此仅考虑工作日和表,这将给出预期的输出:

CREATE TABLE myTable (start_date date, end_date date);

INSERT INTO myTable VALUES('2017-06-01', '2017-06-01'),('2017-05-29', '2017-06-02');

SELECT start_date, end_date,
       SUM(CASE WHEN EXTRACT(dow FROM days) BETWEEN 1 AND 5 THEN 1 ELSE 0 END)
  FROM myTable
 CROSS JOIN LATERAL generate_series(start_date, end_date, interval '1 day') AS days
 GROUP BY start_date, end_date;
它将生成行,每个行都有开始日期、结束日期以及它们之间的一天。然后,它将通过开始日期、结束日期以及星期一到星期五(星期一到星期五)之间的SUM()日期进行更改

如果没有聚合,它看起来是这样的:

 start_date |  end_date  |          days          | dow
------------+------------+------------------------+-----
 2017-06-01 | 2017-06-01 | 2017-06-01 00:00:00+02 |   4
 2017-05-29 | 2017-06-02 | 2017-05-29 00:00:00+02 |   1
 2017-05-29 | 2017-06-02 | 2017-05-30 00:00:00+02 |   2
 2017-05-29 | 2017-06-02 | 2017-05-31 00:00:00+02 |   3
 2017-05-29 | 2017-06-02 | 2017-06-01 00:00:00+02 |   4
 2017-05-29 | 2017-06-02 | 2017-06-02 00:00:00+02 |   5
分组方式:

 start_date |  end_date  | sum
------------+------------+-----
 2017-06-01 | 2017-06-01 |   1
 2017-05-29 | 2017-06-02 |   5

您希望从表的哪一行获取值?所示的语句无效,因为您需要
sum()
group by
-该表中还有其他列吗?主键是什么?@a_horse_,有_no_的名字,解决了我的错误,但我的计算混乱了。对于2017-06-01-2017-06-01,我得到了29。你真的应该向我们展示完整的表结构和你期望的结果。@a_horse_和_no_name我添加了表结构和输出。你想从表的哪一行获取值?所示的语句无效,因为你需要一个
group by
用于
sum()
-该表中还有其他列吗?主键是什么?@a_horse_,有_no_的名字,解决了我的错误,但我的计算混乱了。对于2017-06-01-2017-06-01,我得到了29。您应该真正向我们展示完整的表结构和您期望的结果。@a_horse_,带有_no_名称,我添加了表结构和输出。