2015-07-08 1 views
1

Я хотел бы получить номер недели от даты в Teradata я могу видеть, что есть решения использовать Календарь таблицу Sys, но я хотел бы использовать код, чтобы получить номер неделиTeradata Получить номер недели с помощью SQL кода

Неделя 28, например, является шестым по 12 июля включительно

я нашел этот code, который прекрасно работает, когда вы кладете DATE вместо CDate

SELECT 
((cdate - ((EXTRACT(YEAR FROM cdate) - 1900) * 10000 + 0101 (DATE))) -  ((cdate - DATE '0001-01-07') MOD 7)  + 13)/7 

Моя дата в формате ММ/ДД/YY, и когда я запускаю его, я получаю сообщение электронной ошибки

SELECT ((06/29/15 - ((EXTRACT(YEAR FROM 06/29/15) - 1900) * 10000 + 0101  (DATE))) - ((06/29/15 - DATE '0001-01-07') MOD 7)  + 13)/7 

«Пользователь не может выполнить эту операцию на DATE»

Любая помощь будет высоко оценен

ответ

4

формат даты используется только для литья в строку (= дисплей), но Datatype DATE не имеет формата, это целое число.

06/29/15 не является датой, это расчет, основанный на целых числах 6/29/15, что приводит к целому нулю.

Даты всегда задаются в формате ISO: DATE '2015-06-29':

((DATE '2015-06-29' - ((EXTRACT(YEAR FROM DATE '2015-06-29') - 1900) * 10000 + 0101  (DATE))) - ((DATE '2015-06-29' - DATE '0001-01-07') MOD 7) + 13)/7 

Но ваша неделя, кажется, на основе международного стандарта и этот расчет не будет возвращать правильное количество за последние дни года, например Среда 2014-12-31 будет недели 53, в то время как в ИСО должна быть 1-я неделя. Если ISO недели необходимы вам лучше использовать

WEEKNUMBER_OF_YEAR (DATE '2015-06-29', 'ISO') -- integer 
or 
TO_CHAR(DATE '2015-06-29', 'iw') -- string 

Edit:

Эти функции были добавлены в TD14, прежде чем вы можете использовать следующий код ISO неделю/год:

REPLACE FUNCTION iso_week(cdate DATE) 
RETURNS INT 
SPECIFIC iso_week_date 
RETURNS NULL ON NULL INPUT 
CONTAINS SQL 
DETERMINISTIC 
COLLATION INVOKER 
INLINE TYPE 1 
RETURN 
         (((cDate - ((cdate - DATE '0001-01-01') MOD 7) + 5) 
    - ((EXTRACT(YEAR FROM (cDate - ((cdate - DATE '0001-01-01') MOD 7) + 5)) - 1900) * 10000 + 0101 (DATE)))/7) + 1 (FORMAT '99') 
; 

REPLACE FUNCTION iso_year(cdate DATE) 
RETURNS INT 
SPECIFIC iso_year_date 
RETURNS NULL ON NULL INPUT 
CONTAINS SQL 
DETERMINISTIC 
COLLATION INVOKER 
INLINE TYPE 1 
RETURN 
    EXTRACT (YEAR FROM (cDate - (((cdate - DATE '0001-01-01') MOD 7) + 1) + 4)) (FORMAT '9999') 
; 

Если вы» не разрешено создавать SQL UDF, вы можете просто вырезать & вставить расчет.

+0

Привет @dnoeth, спасибо за ваш быстрый ответ ... Когда я запускаю оба сценария, я получаю сообщение об ошибке: 3707 Ошибка синтаксиса, ожидаемое что-то вроде ')' между ключевым словом 'dAtE' и строкой '2' –

+0

Я просто испытал его, отлично работает для меня как есть. Как вы его подаете? – dnoeth

+0

Представлено как показано ниже ВЫБРАТЬ WEEKNUMBER_OF_YEAR (DATE '2015-06-29', 'ISO') ВЫБОР TO_CHAR (ДАТА '2015-06-29', 'IW') –