Received: from maia.hub.org (unknown [200.46.204.183]) by mail.postgresql.org (Postfix) with ESMTP id DE6E263273B for ; Fri, 26 Mar 2010 07:48:57 -0300 (ADT) Received: from mail.postgresql.org ([200.46.204.86]) by maia.hub.org (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 15607-06 for ; Fri, 26 Mar 2010 10:48:47 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from mx4.wp.pl (mx4.wp.pl [212.77.101.8]) by mail.postgresql.org (Postfix) with ESMTP id 311A3632636 for ; Fri, 26 Mar 2010 07:48:46 -0300 (ADT) Received: (wp-smtpd smtp.wp.pl 8941 invoked from network); 26 Mar 2010 11:48:44 +0100 Received: from aazd173.neoplus.adsl.tpnet.pl (HELO [127.0.0.1]) (ipluta@[83.6.141.173]) (envelope-sender ) by smtp.wp.pl (WP-SMTPD) with AES256-SHA encrypted SMTP for ; 26 Mar 2010 11:48:44 +0100 Message-ID: <4BAC9107.5070701@wp.pl> Date: Fri, 26 Mar 2010 11:48:39 +0100 From: Ireneusz Pluta User-Agent: Thunderbird 2.0.0.24 (Windows/20100228) MIME-Version: 1.0 To: Sergey Konoplev CC: pgsql-sql@postgresql.org Subject: Re: Week to date function References: <4BAB2C15.8090406@wp.pl> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-WP-AV: skaner antywirusowy poczty Wirtualnej Polski S. A. X-WP-SPAM: NO 0000000 [0SO0] X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=-0.74 tagged_above=-10 required=5 tests=BAYES_20=-0.74 X-Spam-Level: X-Archive-Number: 201003/204 X-Sequence-Number: 33911 Sergey Konoplev pisze: > On 25 March 2010 12:25, Ireneusz Pluta 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)