Поиск предыдущего дня недели - PullRequest
2 голосов
/ 19 декабря 2010

В PostgreSQL 8.4, учитывая дату, если эта дата не пятница, я бы хотел найти дату предыдущей пятницы.Может кто-нибудь сказать мне, есть ли встроенная функция, или объяснить логику получения моей собственной функции.

Ответы [ 4 ]

2 голосов
/ 19 декабря 2010

Попробуйте, это работает и в другие дни, блог об этом 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 голос
/ 19 декабря 2010

Вы решаете это без использования кейса:

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;
1 голос
/ 19 декабря 2010
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
0 голосов
/ 19 декабря 2010
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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...