找到一周的前一天

时间:2010-12-19 04:31:27

标签: postgresql

在PostgreSQL 8.4中,给定一个日期,如果该日期不是星期五,我想找到上周五的日期。有人可以告诉我是否有内置函数或给出了我自己的函数背后的逻辑。

4 个答案:

答案 0 :(得分:2)

试试这个,也适用于其他日子,关于它的博客http://www.ienablemuch.com/2010/12/finding-previous-day-of-week.html

create or replace function previous_date_of_day(the_date date, dow int) returns date
as
$$
select
    case when extract(dow from $1) < $2 then
        $1 - ( extract(dow from $1) + (7 - $2) )::int
    else
        $1 - ( extract(dow from $1) - $2)::int
    end;
$$ language 'sql';


select to_char(z.ds, 'Mon dd yyyy dy') as source, 
     to_char( previous_date_of_day(z.ds, 5), 'Mon dd yyyy dy') as dest
from
(
     select 'Dec 1 2010'::date + x.n as ds
     from generate_series(0,17) as x(n)
) as z

答案 1 :(得分:1)

SELECT 
    CASE 
-- 1. if Friday, return date
    WHEN EXTRACT(DOW FROM my_date) = 5 
    THEN my_date
-- 2. if Saturday, subtract 1
    WHEN EXTRACT(DOW FROM my_date) = 6 
    THEN my_date - INTERVAL '1 day'
-- 3. all other days of the week, subtract `DOW + 2` from my_date
    -- should be ELSE for future-proofing ;-) MB
    ELSE -- WHEN EXTRACT(DOW FROM my_date) < 5 THEN
        my_date - ((EXTRACT(DOW FROM my_date) + 2)::TEXT||'days')::INTERVAL
    END AS tgif
FROM 
    my_table
WHERE 
    my_date IS NOT NULL

答案 2 :(得分:1)

您可以不使用大小写来解决它:

select 
the_date 
from 
(
  select 
    now()::date - num as the_date, -- generate rows of possible dates
    extract(dow from (now()::date - num)) -- dow for the where condition
  from (select  generate_series(0,6) as num) as t
) as days 
where date_part = 5;

答案 3 :(得分:0)

select case when extract(dow from your_date) < 5 then
        your_date - (extract(dow from your_date) + integer '2')
       else when extract(dow from your_date) > 5 then
        your_date - integer '1' 
       else 
        your_date
       end

参考http://developer.postgresql.org/pgdocs/postgres/functions-datetime.html