Как узнать номер недели в месяце в Oracle

У меня есть таблица, в которой я сохранил все понедельники, например (1 октября, 8 октября, 15 октября, 22 октября, 29 октября), мне нужно узнать неделю этого месяца, которая будет похожа на 1 октября, это будет 1, 8 октября 2 и впредь .. счетчик сентября снова должен начинаться с 1. Можно ли это сделать через sql-запрос, база данных - oracle 10g?

если первый месяц наступает в среду, то первый понедельник в этом месяце должен быть отмечен как 1, его вторая неделя, но необходимо, как 1.


person Pravin Satav    schedule 31.10.2012    source источник
comment
какой результат вы хотите, когда первое число месяца, например среда?   -  person Erich Kitzmueller    schedule 31.10.2012
comment
если первый месяц наступает в среду, то первый понедельник в этом месяце должен быть отмечен как 1, его вторая неделя, но необходимо как 1. Спасибо за указание на это, вопрос должен был быть устранен сам. ваше здоровье   -  person Pravin Satav    schedule 31.10.2012
comment
Вы можете разделить день месяца на 7 - ваше число SELECT trunc (DOM / 7 + 1) FROM dual ...   -  person Kamil Šrot    schedule 31.10.2012
comment
А как насчет субботы, 1 сентября 2012 года: хотите ли вы 0 в качестве результата, поскольку 1 понедельник сентября приходится на 3 сентября, или это 5, поскольку вы назначаете его на 5-ю неделю августа?   -  person Erich Kitzmueller    schedule 31.10.2012
comment
Данные за сентябрь 2012 г. должны быть такими: 3 сентября = ›1, 10 сентября =› 2, 17 сентября = ›3, 24 сентября 4.   -  person Pravin Satav    schedule 31.10.2012
comment
Я спросил конкретно о 1 сентября. Или вам нужны результаты только по понедельникам? В таком случае подойдет ответ Флорина.   -  person Erich Kitzmueller    schedule 31.10.2012
comment
да .. ответ Флорина - это то, что мне нужно .. Я тестировал то же самое на своем столе .. спасибо   -  person Pravin Satav    schedule 31.10.2012


Ответы (3)


select to_char(your_date,'W') from dual;

сделаю это.

Хорошая таблица для анализа находится здесь:

Вот скрипт SQL, чтобы доказать это.

person Florin Ghita    schedule 31.10.2012
comment
здесь небольшая загвоздка ... если первый месяц наступает в среду, то первый понедельник в этом месяце должен быть отмечен как 1, его вторая неделя, но нужна как 1 ... Я обновил вопрос .. - person Pravin Satav; 31.10.2012
comment
Нет проблем, to_char (date, 'W') будет видеть любую дату от 1 до 7 месяца как первую неделю. - person Florin Ghita; 31.10.2012
comment
Это не то, что ему нужно - ваш код возвращает неделю YEAR, а не неделю MONTH. - person Kamil Šrot; 31.10.2012
comment
@ KamilŠrot, ты ошибаешься. Неделя года - это «WW». Вы можете проанализировать предоставленную мной ссылку. - person Florin Ghita; 31.10.2012
comment
Спасибо @florin, сентябрь 2012, данные должны быть такими: 3 сентября = ›1, 10 сентября =› 2, 17 сентября = ›3, 24 сентября 4, но to_char (date, 'W') не дал мне результата, который я ищу, в таблице, где хранятся только понедельники. - person Pravin Satav; 31.10.2012
comment
как хранятся понедельники? потому что select to_char(to_date('3-Sep-2012'),'W') from dual; дает мне 1. - person Florin Ghita; 31.10.2012
comment
Спасибо .. Это дает мне то, что мне нужно .. Я проверил ответ .. :) - person Pravin Satav; 31.10.2012
comment
Ответ Флорина правильный. Я добавил скрипт SQL, чтобы доказать это - person APC; 31.10.2012
comment
@PravinSatav - значит, вы написали комментарий о том, что это не сработает, прежде чем тестировать? Плохое шоу. - person APC; 31.10.2012
comment
Ну, я подбил, так что кто-нибудь может получить выгоду. - person APC; 31.10.2012

Требуется небольшое изменение в запросе, проверьте на 01 июня 2014 года, он отображается как первая неделя = 2. Используйте запрос ниже, чтобы проверить. Такой же случай применим к 1 января 2017 года.

выберите to_date ('06 / 01/2014 ',' mm / dd / yyyy ') curr_day, next_day (trunc (to_date ('06 / 01/2014', 'mm / dd / yyyy'), 'mm') - 8 , 'солнце') prev_week, trunc ((to_date ('06 / 01/2014 ',' mm / dd / yyyy ') - next_day (trunc (to_date ('06 / 01/2014', 'mm / dd / yyyy') ), 'мм') - 8, 'солнышко')) / 7) +1 "неделя" от дуала;

Правильный запрос должен быть:

выберите to_date ('06 / 01/2014 ',' mm / dd / yyyy ') curr_day, next_day (trunc (to_date ('06 / 01/2014', 'mm / dd / yyyy'), 'mm') ) -7, 'sun') prev_week, trunc ((to_date ('06 / 01/2014 ',' mm / dd / yyyy ') - next_day (trunc (to_date ('06 / 01/2014', 'mm / dd / yyyy '),' mm ') - 7,' sun ')) / 7) +1 "неделя" от двойного;

person Srinivasan KR    schedule 09.01.2016
comment
Oracle 11.2 показывает, что 1 июня 2014 г. и 1 января 2017 г. первая неделя = 1. - person Cristal Embalagens; 19.05.2017

Источник http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:7482139067917

select 
x,
next_day(trunc(x,'mm')-8, 'sun'),
trunc( (x-next_day(trunc(x,'mm')-8, 'sun'))/7 )+1 "week"
from t;

Неделя началась с понедельника по понедельникам.

вы можете проверить это SQL Fiddle

person smily    schedule 13.03.2013