Представление SQL: ошибка ORA

Я создал представление в MS SQL. Это сработало отлично. Когда я экспортировал и импортировал свой проект в среду Oracle, представление больше не работало. Насколько я знаю, я использовал META SQL.

Надеюсь, кто-то может помочь!

SELECT OPRID 
 , DESCR1 
 , DESCR 
 , DESCR5 
 , DESCR6 
 , DESCR7 
 , YEAR 
 , WEEKOFYEAR 
 --When working more then 6 hours, subtract .5 hours break
 , CASE WHEN (CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_MONDAY_START 
 , DG_MONDAY_END))/60) >= 6 THEN (CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_MONDAY_START 
 , DG_MONDAY_END))/60 - 0.5) ELSE (CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_MONDAY_START 
 , DG_MONDAY_END))/60) END AS 'MONDAY' 
 , CASE WHEN (CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_TUESDAY_START 
 , DG_TUESDAY_END))/60) >= 6 THEN (CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_TUESDAY_START 
 , DG_TUESDAY_END))/60 - 0.5) ELSE (CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_TUESDAY_START 
 , DG_TUESDAY_END))/60) END AS 'TUESDAY' 
 , CASE WHEN (CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_WEDNESDAY_START 
 , DG_WEDNESDAY_END))/60) >= 6 THEN (CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_WEDNESDAY_START 
 , DG_WEDNESDAY_END))/60 - 0.5) ELSE (CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_WEDNESDAY_START 
 , DG_WEDNESDAY_END))/60) END AS 'WEDNESDAY' 
 , CASE WHEN (CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_THURSDAY_START 
 , DG_THURSDAY_END))/60) >= 6 THEN (CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_THURSDAY_START 
 , DG_THURSDAY_END))/60 - 0.5) ELSE (CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_THURSDAY_START 
 , DG_THURSDAY_END))/60) END AS 'THURSDAY' 
 , CASE WHEN(CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_FRIDAY_START 
 , DG_FRIDAY_END))/60) >= 6 THEN (CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_FRIDAY_START 
 , DG_FRIDAY_END))/60 - 0.5) ELSE (CONVERT(DECIMAL(10,1) 
 , DATEDIFF(MINUTE 
 , DG_FRIDAY_START 
 , DG_FRIDAY_END))/60) END AS 'FRIDAY' 
 , '0' AS 'TOTAL' 
 --Total will be calculated in PeopleCode
  FROM PS_DG_BPV_ROSTER 
 WHERE YEAR LIKE YEAR(TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD')) 
   AND (DG_MONDAY_START != DG_MONDAY_END 
    OR DG_TUESDAY_START != DG_TUESDAY_END 
    OR DG_WEDNESDAY_START != DG_WEDNESDAY_END 
    OR DG_THURSDAY_START != DG_THURSDAY_END 
    OR DG_FRIDAY_START != DG_FRIDAY_END)

person Laurens    schedule 06.03.2014    source источник
comment
В ORACLE не существует команды CONVERT, изменить с помощью CAST   -  person Joe Taras    schedule 06.03.2014
comment
Кроме того, оператор case должен быть CASE MONDAY WHEN ... THEN ... ELSE ... END, CASE TUESDAY WHEN ... THEN ... ELSE ... END   -  person mavroprovato    schedule 06.03.2014
comment
@Laurens нет, нет, у тебя есть CASE ... END AS MONDAY   -  person mavroprovato    schedule 06.03.2014
comment
Ах вот так.. Спасибо! Хотя полностью проблему не решает.   -  person Laurens    schedule 06.03.2014


Ответы (1)


В вашем запросе вы используете команду CONVERT, но в Oracle вы должны использовать CAST.

Тип DECIMAL должен быть заменен типом NUMBER следующим образом.

Вместо:

CONVERT(DECIMAL(10,1), field)

Использовать:

CAST(field as NUMBER(10,1))

Скажи мне, если это нормально

ИЗМЕНИТЬ После комментария

В Oracle функция Sql Server DATEDIFF была заменена знаком -, как нормальная разница между двумя полями DATA.

Я советую вам этот сайт, где вы найдете эквивалентную функцию между Oracle 10g и Sql Server 2008R2.

person Joe Taras    schedule 06.03.2014
comment
Когда я пытаюсь запустить его, оракул выдает мне ошибку SQL: ORA-00904: DATEDIFF: ongeldige ID 00904. 00000 - %s: неверный идентификатор - person Laurens; 06.03.2014
comment
В Oracle DATEDIFF можно заменить знаком - как разницу между полем DATA - person Joe Taras; 06.03.2014
comment
И как оно возвращается? Секунды? Миллисекунды? - person Laurens; 06.03.2014
comment
вы должны преобразовать разницу в дате в минуту, применив * 24 * 60 (и т. д.). Показать здесь: stackoverflow.com/questions/206222/ - person Joe Taras; 06.03.2014