2013-05-13 5 views
13

У меня есть столбец transdate типа varchar2, который имеет следующиеКак извлечь номер недели в SQL

закусок
01/02/2012 
01/03/2012 

т.д.

я преобразовал его в формат даты в другой колонке, используя функцию to_date. Это формат, который я получил.

01-JAN-2012 
03-APR-2012 

Когда я пытаюсь извлечь weekno, я получаю все нулевые значения.

выберите to_char (to_date (TRANSDATE), 'w') как weekno из tablename.

null 
null 

Как получить неделю с даты в вышеуказанном формате?

+12

Никогда, никогда, ни при каких обстоятельствах хранить даты в 'varchar' столбцов. Только не надо. –

ответ

45

После преобразования вашего varchar2 даты к истинным date типу данных, а затем преобразовать обратно в varchar2 с требуемой маской:

to_char(to_date('01/02/2012','MM/DD/YYYY'),'WW') 

Если вы хотите номер недели в number типа данных, вы можете обернуть заявление в to_number():

to_number(to_char(to_date('01/02/2012','MM/DD/YYYY'),'WW')) 

Однако у вас есть несколько вариантов номера недели, чтобы рассмотреть следующие вопросы:

WW Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year. 
W Week of month (1-5) where week 1 starts on the first day of the month and ends on the seventh. 
IW Week of year (1-52 or 1-53) based on the ISO standard. 
+0

Итак, я не могу получить неделю непосредственно из столбца, формат которого '01-JAN-12'? – user2133404

+0

@ user2133404 Если этот столбец является типом данных даты, тогда да, и в этом случае вам нужно только вызвать 'to_char (my_column, 'WW')' или с желаемой маской формата в этом столбце. Если этот столбец не является истинным типом данных даты, то вы полагаетесь на неявное преобразование в 'date' (если это соответствует вашему' NLS_DATE_FORMAT'), что не так идеально. – Wolf

+0

мы хотим, чтобы воскресенье до субботы, как одна неделя, а затем, как получить номер недели? в вышеуказанном запросе с понедельника по воскресенье включительно считается одной неделей –

2

Попробуйте заменить 'w' для 'iw'. Например:

SELECT to_char(to_date(TRANSDATE, 'dd-mm-yyyy'), 'iw') as weeknumber from YOUR_TABLE; 
+0

По-прежнему получая нулевые значения, я думаю, что числовое значение месяца является причиной ошибки ?? – user2133404

+0

мы хотим, чтобы воскресенье до субботы, как одна неделя, а затем, как получить номер недели? в вышеуказанном запросе с понедельника по воскресенье включительно считается одной неделей –

-1

Используйте 'dd-mon-yyyy', если вы используете 2-й формат дату, указанный в вашем ответе. Пример:

to_date(<column name>,'dd-mon-yyyy') 
0
Select last_name, round (sysdate-hire_date)/7,0) as tuner 
    from employees 
    Where department_id = 90 
    order by last_name; 
+6

Добро пожаловать в ** Stack Overflow **, при отправке ответов, пожалуйста, уточните и объясните, почему они работают, чтобы люди могли учиться у них, спасибо , –

+0

Хотя этот фрагмент кода может решить проблему, он не объясняет, почему и как он отвечает на вопрос. Пожалуйста, [укажите объяснение своего кода] (// meta.stackexchange.com/q/114762/269535), так как это действительно помогает улучшить качество вашего сообщения.Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. ** Флагеры/рецензенты: ** [Для ответов только на код, таких как этот, нисходящий, не удалять!] (// meta.stackoverflow.com/a/260413/2747593) –

Смежные вопросы