pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Ireneusz Pluta <ipluta@wp.pl>
To: Sergey Konoplev <gray.ru@gmail.com>
Cc: pgsql-sql@postgresql.org
Subject: Re: Week to date function
Date: Fri, 26 Mar 2010 11:48:39 +0100
Message-ID: <4BAC9107.5070701@wp.pl> (raw)
In-Reply-To: <c3a7de1f1003250244p440b8244t57319b742fa680f0@mail.gmail.com>
References: <4BAB2C15.8090406@wp.pl>
	<c3a7de1f1003250244p440b8244t57319b742fa680f0@mail.gmail.com>

Sergey Konoplev pisze:
> On 25 March 2010 12:25, Ireneusz Pluta <ipluta@wp.pl> wrote:
>   
>> Hello,
>>
>> is there any standard function, or a concise solution based on set of them,
>> returning a set of dates included in a week of given year and week number?
>> I ended up with creating my own function as in the example below, but I am
>> curious if I am not opening an open door.
>>     
>
> Try to think of something like this?
>
> SELECT
>     date_trunc('week', '2010-01-01'::date) +
>     '12 week'::interval +
>     (d::text||' day')::interval
> FROM generate_series(0, 6) AS d;
>
>   
Yes, much smarter.
However, would give the same results on (year=2009, week=53) and 
(year=2010, week=1). In fact, 2009 did not have week 53.
I wrapped it into a function with additional isoyear check and now seems OK.

Thanks


CREATE OR REPLACE FUNCTION your_week2date(double precision, double 
precision) RETURNS SETOF date
AS
$_$
SELECT  day
FROM (
    SELECT  (
                date_trunc('week', ($1::text||'-01-01')::date)
                + ($2::text||' week')::interval
                + ( d::text||'  day')::interval
            )::date  AS  day
    FROM    generate_series(0, 6) AS d
)   alias
WHERE   to_char(day, 'IYYY')::integer = $1
ORDER
BY      1
$_$
LANGUAGE SQL
IMMUTABLE
;
SELECT week2date1(date_part('year', now()), date_part('week', now()));
 week2date1
------------
 2010-03-22
 2010-03-23
 2010-03-24
 2010-03-25
 2010-03-26
 2010-03-27
 2010-03-28
(7 rows)

SELECT your_week2date(2009, 52) ;
 your_week2date
----------------
 2009-12-28
 2009-12-29
 2009-12-30
 2009-12-31
 2010-01-01
 2010-01-02
 2010-01-03
(7 rows)

SELECT your_week2date(2009, 53) ;
 your_week2date
----------------
(0 rows)

SELECT your_week2date(2010,  1) ;
 your_week2date
----------------
 2010-01-04
 2010-01-05
 2010-01-06
 2010-01-07
 2010-01-08
 2010-01-09
 2010-01-10
(7 rows)




view thread (10+ messages)  latest in thread

Message-ID: <4BAC9107.5070701@wp.pl>
Permalink:  ../4BAC9107.5070701@wp.pl/
Also on:    postgresql.org/message-id/4BAC9107.5070701@wp.pl

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: ipluta@wp.pl, gray.ru@gmail.com
  Subject: Re: Week to date function
  In-Reply-To: <4BAC9107.5070701@wp.pl>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox