【问题标题】:Trying to convert oracle sql to Sql Server date for a migration activity尝试将 oracle sql 转换为 Sql Server 日期以进行迁移活动
【发布时间】: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


【解决方案1】:
THEN TO_DATE(EXTRACT (YEAR FROM SYSDATE) || '-' || EXTRACT (MONTH FROM b.STARTDATE) || '-' || EXTRACT (DAY FROM b.STARTDATE_UPDATED), 'YYYY-MM-DD') 

会变成

THEN DATEFROMPARTS(DATEPART(year, GETDATE()), DATEPART(month, b.STARTDATE), DATEPART(day, b.STARTDATE_UPDATED))

SQL Server 没有 TRUNC 之类的功能 - 因此,我认为您需要巧妙地使用 DATEADDDATEDIFF。有人认为您可以用它来解决这个问题,注意到 SQL Server 中的日期可以分解为从 1900 年 1 月 1 日开始的数字偏移量。DATETIME calculations 上的这个系列可能会帮助您解决这个问题。

【讨论】:

    【解决方案2】:

    根据 Martin 的建议,我完成了工作并最终使 sql 工作。再次感谢。

    SELECT DISTINCT
        b.contract_key,
        b.startdate,
        b.enddate,
        CASE
            --Non Multi-Year
            WHEN multi_year_flag = 'N'                                                      THEN
                NULL
            --Contracts expiring in current year or before
            WHEN CAST(datepart(year, b.enddate) AS INT) <= CAST(datepart(year, getdate()) AS INT) THEN
                NULL
            --Contracts with anniversary in current year
            WHEN datepart(quarter, b.startdate) >= datepart(quarter, getdate())
            --cast(datepart(YEAR, getdate() as int) + '-' + cast(datepart(MONTH, b.STARTDATE) as INT) + '-' + cast(datepart(DAY, b.STARTDATE_UPDATED) as INT), 'YYYY-MM-DD'),'Q') >= TRUNC(SYSDATE, 'Q')
             THEN
                datepart(year, getdate()) + '-' + datepart(month, b.startdate) + '-' + datepart(day, b.startdate_updated)
            --Contracts with anniversary next year
            WHEN datepart(year, dateadd(month, 12, getdate())) < datepart(year, b.enddate)  THEN
                datepart(year, dateadd(month, 12, getdate())) + '-' + datepart(month, b.startdate) + '-' + datepart(day, b.startdate_updated
                )
        END "NEXT_MYA_DATE",
        FROM
        sales_ent.contract_n_dim_bt   b
    

    【讨论】:

      猜你喜欢
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      相关资源
      最近更新 更多