【发布时间】:2020-12-18 01:56:59
【问题描述】:
下面是现有系统中目前使用的oracle SQL查询,我正在尝试将此SQL转换为新系统的SQL Server查询。
我一直在尝试不同的格式,但我没有成功,而且我在 Oracle 方面比在 SQL Server 方面经验丰富。
请在这方面帮助我。
SELECT DISTINCT
b.CONTRACT_KEY,
b.STARTDATE,
b.ENDDATE,
CASE
WHEN MULTI_YEAR_FLAG = 'N' THEN null
WHEN TRUNC(b.ENDDATE, 'Y') <= TRUNC(SYSDATE, 'Y') THEN null
WHEN TRUNC(TO_DATE(EXTRACT (YEAR FROM SYSDATE) || '-' || EXTRACT (MONTH FROM b.STARTDATE) ||
'-' || EXTRACT (DAY FROM b.STARTDATE_UPDATED), 'YYYY-MM-DD'),'Q') >= TRUNC(SYSDATE, 'Q')
THEN TO_DATE(EXTRACT (YEAR FROM SYSDATE) || '-' || EXTRACT (MONTH FROM b.STARTDATE) ||
'-' || EXTRACT (DAY FROM b.STARTDATE_UPDATED), 'YYYY-MM-DD')
WHEN TRUNC(TO_DATE(EXTRACT (YEAR FROM ADD_MONTHS(SYSDATE,12)) || '-' || EXTRACT (MONTH FROM
b.STARTDATE) || '-' || EXTRACT (DAY FROM b.STARTDATE_UPDATED), 'YYYY-MM-DD'),'Y')
< TRUNC(b.ENDDATE, 'Y')
THEN TO_DATE(EXTRACT (YEAR FROM ADD_MONTHS(SYSDATE,12)) || '-' || EXTRACT (MONTH FROM
b.STARTDATE)
|| '-' || EXTRACT (DAY FROM b.STARTDATE_UPDATED), 'YYYY-MM-DD')
END "NEXT_MYA_DATE"
FROM
SALES_ENT.CONTRACT_N_DIM_BT b
【问题讨论】:
-
如果您要求完全重写,您的问题可能过于宽泛。如果您有关于如何重写的具体问题,我们很乐意为您提供帮助。
-
因此@TimBiegeleisen 评论,oracle 和sql server 有如此不同的语法,例如在oracle 中我们可以使用
to_date,但我认为在sql server 中你必须使用convert。所以用 sql server 语法重写整个查询几乎是你最好的选择,而不是尝试修改格式或字符串。 -
我专门寻找转换这一行: TRUNC(TO_DATE(EXTRACT (YEAR FROM SYSDATE) || '-' || EXTRACT (MONTH FROM b.STARTDATE) || '-' || EXTRACT ( DAY FROM b.STARTDATE_UPDATED), 'YYYY-MM-DD'),'Q') >= TRUNC(SYSDATE, 'Q') THEN TO_DATE(EXTRACT (YEAR FROM SYSDATE) || '-' || EXTRACT (MONTH FROM b.STARTDATE) || '-' || EXTRACT (DAY FROM b.STARTDATE_UPDATED), 'YYYY-MM-DD')
-
您需要使用
DATEPART来执行EXTRACT命令,DATEFROMPARTS从您使用TO_DATE的年月日重建日期并删除时间部分你可以做CAST(b.ENDDATE as DATE)
标签: sql sql-server oracle