Mohammad Azeem Ответов: 2

Проблемы преобразования запросов Oracle в SQL


Dear All, 

can someone please help to convert the following oracle query to sql specific please.. as i am really struggling with that ..

SELECT "SAMPLE"."ID_NUMERIC",   
         "SAMPLE"."BATCH_NO",   
         "SAMPLE"."STATUS",   
         "SAMPLE"."RECD_DATE",   
         "SAMPLE"."DATE_AUTHORISED",   
         "SAMPLE"."TEMPLATE_ID",   
         "SAMPLE"."RELEASE_DATE",
         "SAMPLE"."LOGIN_DATE",
         "SAMPLE"."DATE_COMPLETED",   

         TRUNC((((86400 * (DATE_COMPLETED-RECD_DATE))/60)/60)/24) AS VC_Days,
	 		TRUNC(((86400 * (DATE_COMPLETED-RECD_DATE))/60)/60) - (24 * (TRUNC((((86400 * (DATE_COMPLETED-RECD_DATE))/60)/60)/24))) AS VC_Hrs,
	 		TRUNC((86400 * (DATE_COMPLETED-RECD_DATE))/60) - (60 * (TRUNC(((86400 * (DATE_COMPLETED-RECD_DATE))/60)/60))) AS VC_Min,
	 		TRUNC(86400 * (DATE_COMPLETED-RECD_DATE)) - (60 * (TRUNC((86400 * (DATE_COMPLETED-RECD_DATE))/60))) AS VC_Sec,
         
         TRUNC((((86400 * (RELEASE_DATE-RECD_DATE))/60)/60)/24) AS VR_Days,
	 		TRUNC(((86400 * (RELEASE_DATE-RECD_DATE))/60)/60) - (24 * (TRUNC((((86400 * (RELEASE_DATE-RECD_DATE))/60)/60)/24))) AS VR_Hrs,
	 		TRUNC((86400 * (RELEASE_DATE-RECD_DATE))/60) - (60 * (TRUNC(((86400 * (RELEASE_DATE-RECD_DATE))/60)/60))) AS VR_Min,
	 		TRUNC(86400 * (RELEASE_DATE-RECD_DATE)) - (60 * (TRUNC((86400 * (RELEASE_DATE-RECD_DATE))/60))) AS VR_Sec,

	 		TRUNC((((86400 * (DATE_AUTHORISED-DATE_COMPLETED))/60)/60)/24) AS CA_Days,
	 		TRUNC(((86400 * (DATE_AUTHORISED-DATE_COMPLETED))/60)/60) - (24 * (TRUNC((((86400 * (DATE_AUTHORISED-DATE_COMPLETED))/60)/60)/24))) AS CA_Hrs,
	 		TRUNC((86400 * (DATE_AUTHORISED-DATE_COMPLETED))/60) - (60 * (TRUNC(((86400 * (DATE_AUTHORISED-DATE_COMPLETED))/60)/60))) AS CA_Min,
	 		TRUNC(86400 * (DATE_AUTHORISED-DATE_COMPLETED)) - (60 * (TRUNC((86400 * (DATE_AUTHORISED-DATE_COMPLETED))/60))) AS CA_Sec,

	 		TRUNC((((86400 * (DATE_AUTHORISED-RECD_DATE))/60)/60)/24) AS VA_Days,
	 		TRUNC(((86400 * (DATE_AUTHORISED-RECD_DATE))/60)/60) - (24 * (TRUNC((((86400 * (DATE_AUTHORISED-RECD_DATE))/60)/60)/24))) AS VA_Hrs,
	 		TRUNC((86400 * (DATE_AUTHORISED-RECD_DATE))/60) - (60 * (TRUNC(((86400 * (DATE_AUTHORISED-RECD_DATE))/60)/60))) AS VA_Min,
	 		TRUNC(86400 * (DATE_AUTHORISED-RECD_DATE)) - (60 * (TRUNC((86400 * (DATE_AUTHORISED-RECD_DATE))/60))) AS VA_Sec

    FROM "SAMPLE"  
  
   
MAzeem


Что я уже пробовал:

не знаю, как преобразовать это в sql one

2 Ответов

Рейтинг:
2

CHill60

Сначала поймите, что такое VC_Days, VC_Hrs, VC_Min, VC_Secons, и избавьтесь от этих нелепых вычислений.

Похоже, что вы пытаетесь выразить некоторые даты в виде дней, часов, минут и секунд, усекая значение (обратите внимание, что 86400 = 60 * 60 * 24 - то есть количество секунд в сутках)

Не видя некоторых выборочных данных и фактических результатов я не собираюсь вдаваться в большую глубину но функция SQL вам вероятно понадобится DATEPART (Transact-SQL) - SQL Server | Microsoft Docs[^]
При толчке вы можете захотеть посмотреть на DATEDIFF (Transact-SQL) - SQL Server | Microsoft Docs[^]

Чтобы доказать это, сначала вы можете преобразовать запрос Oracle и сравнить результаты - есть также Функция datepart[^] и функция DateDiff[^] в Oracle


Maciej Los

5ed!

Рейтинг:
2

Gerry Schmitz

Начните с создания функции для всех этих повторяющихся вычислений.

Обратите внимание на константы и переменные (параметры).