【问题标题】:Defining a business month: first Sunday of a month until first Saturday of next month定义一个营业月:一个月的第一个星期日到下个月的第一个星期六
【发布时间】:2014-07-08 15:37:39
【问题描述】:

我有一个带有时间戳字段的表。在 Postgresql 中,我必须在本月的第一个星期日到下个月的第一个星期六之间定义一个“营业月”(例如 2014-04-06 到 2014-05-03 将是“2014 年 4 月”)。

我不太确定从哪里开始。到目前为止,我得到的是来自this forum post(使用 T-SQL)的第一个星期日。

--first sunday of this month....
-1=sunday,-2=saturday,-3-friday etc
SELECT
datename(dw,dateadd(dd,-1,DATEADD(wk, 
DATEDIFF(wk,0,dateadd(dd,7-datepart(day,getdate()),getdate())), 0))),
dateadd(dd,-1,DATEADD(wk, 
DATEDIFF(wk,0,dateadd(dd,7-datepart(day,getdate()),getdate())), 0))

我可能需要建立一个日历表并手动定义月份。但我想探索其他解决方案。

【问题讨论】:

  • 没有比日历表更好的解决方案了。
  • 我也强烈推荐一个日历表。当您开始处理复杂的日期操作时,很容易搞砸您的逻辑并且直到投入生产数月(甚至数年)后才注意到它。闰年是一个特别常见的错误来源。如果是我,我肯定会为此创建一个日历表。这将比使用逻辑表达式处理日期更直接。

标签: sql postgresql date datetime calendar


【解决方案1】:

SQL Fiddle

功能

create or replace function business_month("month" date)
returns table (first_day date, last_day date) as $$

    with first_month_day as (
        select date_trunc('month', month)::date as first_day
    ), first_business_day as (
        select
            first_day
            + (extract(dow from first_day)::int > 0)::int * 7
            - extract(dow from first_day)::int
            as first_day
        from first_month_day
    ), first_next_month_day as (
        select (first_day + interval '1 month')::date as first_day
        from first_month_day
    ), last_business_day as (
        select
            first_day
            + 6
            - extract(dow from first_day)::int
            as last_day
        from first_next_month_day
    )
    select
        (select first_day from first_business_day) as first_day,
        (select last_day from last_business_day) as last_day
    ;
$$ language sql stable;

测试一下

select
    to_char(d, 'YYYY Month') as month,
    to_char(first_day, 'YYYY-MM-DD Day') as first_day,
    to_char(last_day, 'YYYY-MM-DD Day') as last_day
from
    generate_series ('2010-01-01'::date, '2014-12-31', '1 month') g (d)
    ,
    business_month(d::date)
;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2014-07-21
    • 1970-01-01
    • 2016-11-23
    • 2014-02-11
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多