2016-05-19 5 views
0

У меня есть запрос в teradata, где я пытаюсь получить номер недели с определенной даты в формате yyyymmdd (20160201). У нас есть календарная таблица (а не Teradata один, потому что мы считаем неделю немного по-другому), которая позволяет объединить дату и экспортировать результатыРасчет недели Терадата

Когда я выполнить запрос со статическими датами поэтому для примера ниже работает отлично

FROM table_main AL1 
JOIN cal_table cal 
    ON AL1.run_date = cal.cal_dateyyyymmdd 
WHERE AL1.run_date >= 20160201 
AND AL1.run_date < 20160220 

Когда я пытаюсь обобщить заявление на прошлой неделе

FROM table_main AL1 
JOIN cal_table cal 
    ON AL1.run_date = cal.cal_dateyyyymmdd 
WHERE AL1.run_date >= CAST(CAST(((DATE-DAYOFWEEK(DATE)-5) (FORMAT 'YYYYMMDD')) AS CHAR(8)) AS INT) 
AND AL1.run_date < CAST(CAST(((DATE-DAYOFWEEK(DATE)+ 1) (FORMAT 'YYYYMMDD')) AS CHAR(8)) AS INT) 

Я получаю ошибку

SELECT Failed. 3706: Syntax error: expected something between ')' and '-'.

Кто-нибудь когда-либо видел это раньше?

ответ

2

DAYOFWEEK не является существующей функцией Teradata, это синтаксис ODBC, который иногда (не гарантируется в вашем случае) автоматически переводится ODBC-драйвером в действительный Teradata SQL. Он будет работать, если вы используете правильный синтаксис {fn DAYOFWEEK(DATE_)}, но imho вы всегда должны избегать этих функций ODBC (отметьте Отключить парсинг в опциях ODBC), потому что он будет терпеть неудачу при отправке одного и того же запроса с использованием JDBC/.NET/CLI.

И ваш расчет является чрезмерно сложным, попытайтесь избежать дорогостоящих приведения типов даты/строка:

WHERE AL1.run_date >= CAST(NEXT_DAY(DATE-13, 'mon') AS INT) + 19000000 
AND AL1.run_date < CAST(NEXT_DAY(DATE-7, 'sun') AS INT) + 19000000 

NEXT_DAY(..., 'mon') -- find the next monday 
CAST(... AS INT) -- returns YYMMDD 
... + 19000000 -- to match your date key 
+0

Спасибо @dnoeth. это то, что я искал. Я также обнаружил, что могу полностью удалить таблицу и использовать 'week (cast ((run_date - 19000000) AS DATE)) как week_num', который, похоже, работает –

+0

@JohnSmith:' week' - это еще одна функция ODBC, и я сомневаюсь, что она всегда возвращается правильный номер. Если вам нужны недели ISO, то WEEKNUMBER_OF_YEAR может быть тем, что вы хотите, есть опция «ISO». – dnoeth

+0

OK, большое спасибо. Я не понимал –

0

вы не можете поставить (AS) в (где положение) Это принято только в столбцах запроса.

+0

Привет, спасибо за быстрый ответ. Я не уверен, что я следую. Если я использую 'CAST (CAST (((DATE-DAYOFWEEK (DATE) -5) (FORMAT 'YYYYMMDD')) AS CHAR (8)) AS INT)' и не присоединяется к другой таблице на нем, это работает отлично. Разве это просто запрещено, если вы хотите присоединиться к другой таблице? –

+0

использовать его как это: ОТ table_main AL1 РЕГИСТРИРУЙТЕСЬ cal_table кал НА AL1.run_date = cal.cal_dateyyyymmdd ГДЕ AL1.run_date> = CAST (CAST (((ДАТА-DAYOFWEEK (ДАТА) -5) (формат «ГГГГММДД ')) AS CHAR (8))) И AL1.run_date

+0

Hi @Mohamed , Не могли бы вы объяснить мне, что вы изменили, поскольку он выглядит идентично заявлению проблемы во втором фрагменте кода. –