【问题标题】:convert date format of oracle query to sql server query将oracle查询的日期格式转换为sql server查询
【发布时间】:2021-05-19 11:04:31
【问题描述】:

我正在尝试将以下 oracle 查询转换为 SQL 服务器查询。

Select * from table A
WHERE  TRUNC(a.Generate_DATE,'MM') = (SELECT (NVL (TRUNC (TO_DATE ('$$date','MM/DD/YYYY HH24:MI:SS')),TRUNC(ADD_MONTHS(SYSDATE, -1),'MM'))) FROM DUAL)

其中 $$date 是参数值,将从查询外部传递。

问题在于日期格式。我无法在 sql server 中转换这种精确格式。

【问题讨论】:

  • 如果您使用的是 SQL Server,请首先使用类型良好的参数,您不需要任何这些转换过程,只需要基本的日期逻辑。
  • 我是 sql server 新手。请提供日期逻辑
  • 我看不懂 PL\SQL,所以我无法为您翻译以上内容,但基本的意思是基本的,例如 WHERE DateColumn = @DataParameterWHERE DateColumn >= @StartDate AND DateColumn < @EndDate
  • 它应用的不是简单的日期过滤器。我们正在对日期进行一些转换,如 oracle 中的 trunc(date,'MM') 这给出了该月的第一个日期。第二部分是使用 NVL 函数。寻找sql server 中的等效函数。但是无论我在 google 中看到什么,都没有可用的直接函数
  • "我们在 oracle 中对日期进行一些转换,例如 trunc(date,'MM'),这给出了当月的第一个日期。" 不要这样做,这是不可搜索。而不是将列的日期更改为月份的第一个日期,而是使用日期边界;就像我在上面的评论中展示的那样。不要将列的值更改为2021-02-01,而是查找列的值为>= '2021-02-01'< '2021-03-01' 的行。就像我说的,基本的日期逻辑。

标签: sql-server oracle11g sql-server-2012 date-conversion code-migration


【解决方案1】:

要获取当月的第一天,请使用 dateaddday,例如

declare @d date = getdate()
select dateadd(day,  1-day(@d), @d)

对于NVL,使用标准的coalesce 函数。

对于TRUNC,请使用cast(getdate() as date)

对于ADD_MONTHS(SYSDATE, -1),请使用dateadd(month,-1,getdate())

或获取SQL Server Migration Assistant for Oracle,它将为您将 Oracle SQL 和 PL/SQL 转换为 TSQL。它还安装了一堆兼容性功能,因此使用 SSMA 将其翻译为:

WHERE ssma_oracle.trunc_date2(A.END_DATE, 'MM') = 
   (
      SELECT isnull(ssma_oracle.trunc_date(ssma_oracle.to_date2('12/01/2020 18:15:00', 'MM/DD/YYYY HH24:MI:SS')), ssma_oracle.trunc_date2(dateadd(m, -1, sysdatetime()), 'MM')) AS expr
   )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 2021-05-08
    相关资源
    最近更新 更多