简体   繁体   English

如何从 PostgreSQL 获取特定日期的特定数据?

[英]How can i get specific data from a specific date from PostgreSQL?

I have a table in PostgreSQL like below...我在 PostgreSQL 中有一个表,如下所示......

emp_id   emp_name     date     shift
  001     Rana     01.07.2019    G
  001     Rana     02.07.2019    G
  001     Rana     03.07.2019    G
  001     Rana     04.07.2019    G
  001     Rana     05.07.2019    Off
  001     Rana     06.07.2019    G
  001     Rana     07.07.2019    G
  ................................
  ................................
  ................................
  001     Rana     30.06.2020    G   [total 365 days]
  002     Tame     01.07.2019    G
  002     Tame     02.07.2019    G
  002     Tame     03.07.2019    G
  002     Tame     04.07.2019    G
  002     Tame     05.07.2019    Off
  002     Tame     06.07.2019    G
  002     Tame     07.07.2019    G
  ................................
  ................................
  ................................
  002     Tame     30.06.2020    G

I would like to pass "date=04.07.2019" into the parameter, then print will ...我想将“date = 04.07.2019”传递到参数中,然后打印将...

emp_id   emp_name     Thursday   Friday  Saturday   Sunday  Monday  Tuesday   Wednesday
  001      Rana           G         Off     G         G       G        G          G
  002      Tame           G         Off     G         G       G        G          G

I would also like to pass another "date=26.11.2019" into the parameter, then print will ...我还想将另一个“date = 26.11.2019”传递到参数中,然后打印将......

emp_id   emp_name     Tuesday   Wednesday   Thursday   Friday  Saturday   Sunday  Monday  
  001      Rana          G          G          G         Off      G         G        G
  002      Tame          G          G          G         Off      G         G        G

You can use CASE Expression and Aggregate function您可以使用CASE ExpressionAggregate函数

FIDDLE DEMO 小提琴演示

SELECT E.emp_name,E.emp_id,
       MAX(CASE WHEN trim(to_char(D.date_trunc, 'Day')) = 'Monday' THEN E.shift Else NULL END) AS "Monday",
       MAX(CASE WHEN trim(to_char(D.date_trunc, 'Day')) = 'Tuesday' THEN E.shift Else NULL EnD) AS "Tuesday",
       MAX(CASE WHEN trim(to_char(D.date_trunc, 'Day')) = 'Wednesday' THEN E.shift Else NULL EnD) AS "Wednesday",
       MAX(CASE WHEN trim(to_char(D.date_trunc, 'Day')) = 'Thursday' THEN E.shift Else NULL EnD) AS "Thursday",
       MAX(CASE WHEN trim(to_char(D.date_trunc, 'Day')) = 'Friday' THEN E.shift Else NULL EnD) AS "Friday",
       MAX(CASE WHEN trim(to_char(D.date_trunc, 'Day')) = 'Saturday' THEN E.shift Else NULL EnD) AS "Saturday",
       MAX(CASE WHEN trim(to_char(D.date_trunc, 'Day')) = 'Sunday' THEN E.shift Else NULL EnD) AS "Sunday"
FROM
(
  SELECT date_trunc('day', dd):: date 
  FROM generate_series('04.07.2019'::timestamp,'04.07.2019'::timestamp + INTERVAL '6 day','1 day'::interval) dd
) D JOIN Employee E ON E.date = D.date_trunc
GROUP BY  E.emp_name,E.emp_id;

Updated Query更新查询

FIDDLE DEMO 小提琴演示

As per a_horse_with_no_name suggestion, below is the modified query, which will be more easier to read by using filter() .根据a_horse_with_no_name建议,下面是修改后的查询,使用filter()会更容易阅读。

SELECT E.emp_name,E.emp_id,
       MAX(e.shift) filter (where trim(to_char(D.date_trunc, 'Day')) = 'Monday') AS "Monday",
       MAX(e.shift) filter (where trim(to_char(D.date_trunc, 'Day')) = 'Tuesday') AS "Tuesday",
       MAX(e.shift) filter (where trim(to_char(D.date_trunc, 'Day')) = 'Wednesday') AS "Wednesday",
       MAX(e.shift) filter (where trim(to_char(D.date_trunc, 'Day')) = 'Thursday') AS "Thursday",
       MAX(e.shift) filter (where trim(to_char(D.date_trunc, 'Day')) = 'Friday') AS "Friday",
       MAX(e.shift) filter (where trim(to_char(D.date_trunc, 'Day')) = 'Saturday') AS "Saturday",
       MAX(e.shift) filter (where trim(to_char(D.date_trunc, 'Day')) = 'Sunday') AS "Sunday"
FROM (
  SELECT date_trunc('day', dd):: date 
  FROM generate_series('04.07.2019'::timestamp,'04.07.2019'::timestamp + INTERVAL '6 day','1 day'::interval) dd
) D JOIN Employee E ON E.date = D.date_trunc
GROUP BY  E.emp_name,E.emp_id;

Output:输出:

在此处输入图片说明

Below query also work...下面的查询也有效...

FIDDLE DEMO 小提琴演示

select  e.emp_id,e.emp_name,
    MAX(CASE WHEN trim(to_char(e.date, 'Day')) = 'Saturday' THEN e.shift Else NULL EnD) AS "Saturday",
    MAX(CASE WHEN trim(to_char(e.date, 'Day')) = 'Sunday' THEN e.shift Else NULL EnD) AS "Sunday",
    MAX(CASE WHEN trim(to_char(e.date, 'Day')) = 'Monday' THEN e.shift Else NULL END) AS "Monday",
    MAX(CASE WHEN trim(to_char(e.date, 'Day')) = 'Tuesday' THEN e.shift Else NULL EnD) AS "Tuesday",
    MAX(CASE WHEN trim(to_char(e.date, 'Day')) = 'Wednesday' THEN e.shift Else NULL EnD) AS "Wednesday",
    MAX(CASE WHEN trim(to_char(e.date, 'Day')) = 'Thursday' THEN e.shift Else NULL EnD) AS "Thursday",
    MAX(CASE WHEN trim(to_char(e.date, 'Day')) = 'Friday' THEN e.shift Else NULL EnD) AS "Friday"
from    employee e
group by e.emp_id,e.emp_name
order by e.emp_id

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM