2013-02-13 39 views
7

我想创建一个函数来获得正确的一周数。 我已经发布here找到一个'原生'解决方案,但显然没有。功能获得正确的一周数

我tryed是代码转换到PostgreSQL来创建基于此mysql example

这里funcrtion:

CREATE OR REPLACE FUNCTION week_num_year(_date date)  
RETURNS integer AS 
$BODY$declare 
_year integer; 
begin 


select date_part('year',_date) into _year; 
return ceil((to_char(_date,'DDD')::integer+(to_char(('01-01-'||_year)::date,'D')::integer%7-7))/7);   


end;$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

但它给错误的结果,有人可以帮我吗?

我的配置:PostgreSQL 9.2

回答

6
create or replace function week_num_year(_date date) 
returns integer as 
$body$ 
declare 
_year date; 
_week_number integer; 
begin 
select date_trunc('year', _date)::date into _year 
; 
with first_friday as (
    select extract(doy from a::date) ff 
    from generate_series(_year, _year + 6, '1 day') s(a) 
    where extract(dow from a) = 5 
) 
select floor(
     (extract(doy from _date) - (select ff from first_friday) - 1)/7 
    ) + 2 into _week_number 
; 
return _week_number 
; 
end; 
$body$ 
language plpgsql immutable 
+0

再次感谢@Clodoaldo – Houari 2013-02-13 19:05:43

0

怎么样inbuild提取功能?

SELECT extract (week from current_timestamp) FROM A_TABLE_FROM_YOUR_DB; 
+0

不,如果你有,例如测试:从“2005-01 SELECT提取物(周-01':: date)给出53,并且应该给1,因为这是第一周(考虑到星期六是一周的第一天) – Houari 2013-02-13 15:27:29

+0

@Houari呃,不,它不是。这是去年最后一周的最后一部分。周数很愚蠢,这是它们没有被广泛使用的原因之一。查看日历以了解原因。 IIRC有时第二年的第一周也可以在去年的最后几天开始。 – 2013-02-13 16:05:48

+0

@CraigRinger你为什么说这个'笨'?这些都是要求,我想要得到它的解决方案! – Houari 2013-02-13 18:48:32

16

如果你想正确的周数使用:

select extract(week from '2012-01-01'::date); 

会产生这样的结果52,如果你看看在日历上是正确的。

现在,如果您确实希望将星期数定义为“每7天从一年的第一天开始”,那很好,但它与其他人使用的星期数不匹配,并且有一些奇怪的怪癖:

select floor((extract(doy from '2011-01-01'::date)-1)/7)+1; 

顺便说一句,解析日期字符串,并用字符串函数篡改它们几乎总是一个非常糟糕的主意。

0

您可以通过运行检索一周,也是今年的星期几:

select id,extract(DOW from test_date),extract(week from test_date), testdate,name from yourtable