Функция Получение правильного номера недели года

Я хочу создать функцию, чтобы получить правильный номер недели года. Я уже разместил здесь, чтобы найти "родное" решение, но видимо нет.

Я попытался создать функцию на основе этого примера mysql.

Вот код, переведенный в postgresql:

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


person Houari    schedule 13.02.2013    source источник


Ответы (4)


Если вам нужны правильные номера недель, используйте:

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

Это даст результат 52, что правильно, если вы посмотрите на календарь.

Теперь, если вы действительно хотите определить номера недель как «Каждые 7 дней, начиная с первого дня года», это нормально, хотя это не соответствует номерам недель, которые кто-либо еще использует, и имеет некоторые странные причуды:

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

Между прочим, парсинг строк даты и их взлом с помощью строковых функций — почти всегда очень плохая идея.

person Craig Ringer    schedule 13.02.2013

Вы можете получить день недели, а также неделю года, запустив:

   select  id,extract(DOW from test_date),extract(week from test_date), testdate,name from yourtable
person Veeranjaneyulu .Kota    schedule 06.09.2017

Как насчет встроенной функции извлечения?

SELECT extract (week from current_timestamp) FROM A_TABLE_FROM_YOUR_DB;
person OkieOth    schedule 13.02.2013
comment
Нет, если вы проверите это, например: SELECT Extract (неделя с '2005-01-01'::date) дает 53, а должен дать 1, потому что это первая неделя (учитывая, что суббота - первый день недели ) - person Houari; 13.02.2013
comment
@Huari Э, нет, это не так. Это последняя часть последней недели предыдущего года. Номера недель такие глупые, и это одна из причин, по которой они не используются широко. Посмотрите на календарь, чтобы понять, почему. IIRC иногда первая неделя следующего года может начинаться и в последние несколько дней предыдущего года. - person Craig Ringer; 13.02.2013
comment
@CraigRinger Почему ты говоришь это «глупо» ?? Это требования, и я хотел найти для них решение! - person Houari; 13.02.2013
comment
@Huari Возможно, вы неправильно поняли, что я сказал. Я говорю, что нумерация недель такая же глупая. Это не означает, что вы или ваши требования глупы. Это идиома; это можно было бы перефразировать, поскольку номера недель довольно странны в том смысле, что первые несколько дней года вполне могут приходиться на конец последней недели предыдущего года. Смотрите мой ответ для подробного объяснения. Кажется, вам нужна другая схема нумерации недель, чем стандартная, где неделя начинается в любой день, который является первым днем ​​в этом году. - person Craig Ringer; 14.02.2013
comment
Календари стандартизированы во всем мире ISO в стандарте 8601. Если чьи-то требования отличаются от этого, может потребоваться написать для этого собственное программное обеспечение. Очевидно, что для межкультурного бизнеса лучше и полезнее придерживаться стандартов ISO. - person Holger Jakobs; 10.05.2014

person    schedule
comment
Еще раз спасибо @Clodoaldo - person Houari; 13.02.2013