为了账号安全,请及时绑定邮箱和手机立即绑定

如何在psql中获取当月星期日的计数?

/ 猿问

如何在psql中获取当月星期日的计数?

绝地无双 2019-10-21 15:30:21

如何在PostgreSQL中获取给定日期的星期日总数



查看完整描述

3 回答

?
哔哔one

给定日期的星期日总数只能为0或1。


但是,如果您希望在给定日期范围内的星期天数,那么最好的选择是日历表。为了找出今年2月的星期天数,我只是


select count(*) 

from calendar

where cal_date between '2011-02-01' and '2011-02-28' and

      day_of_week = 'Sun';

要么


select count(*)

from calendar

where year_of_date = 2011 and

      month_of_year = 2 and 

      day_of_week = 'Sun';

这是您可以开始使用的基本日历表。我还包括一个PostgreSQL函数来填充日历表。我没有在8.3中进行测试,但是我很确定自己没有使用8.3不支持的任何功能。


请注意,“ dow”部分假设您的日子为英语。但是您可以轻松地编辑这些部分以匹配任何语言。(我认为。但是“轻松”可能是错误的。)


-- Table: calendar


-- DROP TABLE calendar;


CREATE TABLE calendar

(

  cal_date date NOT NULL,

  year_of_date integer NOT NULL,

  month_of_year integer NOT NULL,

  day_of_month integer NOT NULL,

  day_of_week character(3) NOT NULL,

  CONSTRAINT calendar_pkey PRIMARY KEY (cal_date),

  CONSTRAINT calendar_check CHECK (year_of_date::double precision = date_part('year'::text, cal_date)),

  CONSTRAINT calendar_check1 CHECK (month_of_year::double precision = date_part('month'::text, cal_date)),

  CONSTRAINT calendar_check2 CHECK (day_of_month::double precision = date_part('day'::text, cal_date)),

  CONSTRAINT calendar_check3 CHECK (day_of_week::text = 

CASE

    WHEN date_part('dow'::text, cal_date) = 0::double precision THEN 'Sun'::text

    WHEN date_part('dow'::text, cal_date) = 1::double precision THEN 'Mon'::text

    WHEN date_part('dow'::text, cal_date) = 2::double precision THEN 'Tue'::text

    WHEN date_part('dow'::text, cal_date) = 3::double precision THEN 'Wed'::text

    WHEN date_part('dow'::text, cal_date) = 4::double precision THEN 'Thu'::text

    WHEN date_part('dow'::text, cal_date) = 5::double precision THEN 'Fri'::text

    WHEN date_part('dow'::text, cal_date) = 6::double precision THEN 'Sat'::text

    ELSE NULL::text

END)

)

WITH (

  OIDS=FALSE

);

ALTER TABLE calendar OWNER TO postgres;


-- Index: calendar_day_of_month


-- DROP INDEX calendar_day_of_month;


CREATE INDEX calendar_day_of_month

  ON calendar

  USING btree

  (day_of_month);


-- Index: calendar_day_of_week


-- DROP INDEX calendar_day_of_week;


CREATE INDEX calendar_day_of_week

  ON calendar

  USING btree

  (day_of_week);


-- Index: calendar_month_of_year


-- DROP INDEX calendar_month_of_year;


CREATE INDEX calendar_month_of_year

  ON calendar

  USING btree

  (month_of_year);


-- Index: calendar_year_of_date


-- DROP INDEX calendar_year_of_date;


CREATE INDEX calendar_year_of_date

  ON calendar

  USING btree

  (year_of_date);

和一个基本功能来填充表格。我也没有在8.3中进行测试。


-- Function: insert_range_into_calendar(date, date)


-- DROP FUNCTION insert_range_into_calendar(date, date);


CREATE OR REPLACE FUNCTION insert_range_into_calendar(from_date date, to_date date)

  RETURNS void AS

$BODY$


DECLARE

    this_date date := from_date;

BEGIN


    while (this_date <= to_date) LOOP

        INSERT INTO calendar (cal_date, year_of_date, month_of_year, day_of_month, day_of_week)

        VALUES (this_date, extract(year from this_date), extract(month from this_date), extract(day from this_date),

        case when extract(dow from this_date) = 0 then 'Sun'

             when extract(dow from this_date) = 1 then 'Mon'

             when extract(dow from this_date) = 2 then 'Tue'

             when extract(dow from this_date) = 3 then 'Wed'

             when extract(dow from this_date) = 4 then 'Thu'

             when extract(dow from this_date) = 5 then 'Fri'

             when extract(dow from this_date) = 6 then 'Sat'

        end);

        this_date = this_date + interval '1 day';

    end loop;       


END;

$BODY$

  LANGUAGE plpgsql VOLATILE

  COST 100;


查看完整回答
反对 回复 2019-10-21
?
忽然笑

您需要提取:


SELECT 

    EXTRACT(DOW FROM DATE '2011-02-16') = 0; -- 0 is Sunday

这可能会导致是非题,这是星期日还是不是星期日。我不知道您所说的“总数”是什么意思,因为它总是0(日期不是星期天)或1(给定的数据是星期天)。


编辑:像这样吗?


SELECT 

    COUNT(*)

FROM

    generate_series(timestamp '2011-01-01', '2011-03-01', '1 day') AS g(mydate)

WHERE

    EXTRACT(DOW FROM mydate) = 0;


查看完整回答
反对 回复 2019-10-21
?
慕仙森

日历表更通用-对它的简单查询可以回答各种各样的问题。(“简单”表示维护程序员和实习生可以做到这一点,而不会问我问题。)对此的查询和观点可以利用索引。使用工作中的典型查询,日历表比generate_series()快2至15倍,并且可以轻松地用于联接中。日历表也是平台无关的-它们甚至可以在Microsoft Access中工作。

查看完整回答
反对 回复 2019-10-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信