0

我们在 SQL Server 2012 中有以下 SQL 脚本。我们将在数据库转换时在 postgresql (HAWQ 1.3.1) 中编写类似的脚本

SELECT * 
FROM tablename_1 
LEFT OUTER JOIN
     (SELECT 
          SUM(b.OrderValue) AS OrderValue, b.OrderDate, b.Description 
      FROM 
          (SELECT * 
           FROM tablename_2 rcd
           LEFT JOIN 
                (SELECT Distinct 
                     afv.Item, afv.Description, afd.KeyField
                 FROM tablename_3 afd
                 JOIN tablename_3 afv ON afv.FormType = afd.FormType 
                                      AND afv.FieldName = afd.FieldName 
                                      AND afv.Item = afd.AlphaValue
                 WHERE
                      afd.FormType = 'CUS'
                      AND afd.FieldName = 'COR002') a ON a.KeyField = rcd.Customer 
           WHERE
               OrderDate >= CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(GETDATE())-1),GETDATE()), 101)) b 
    GROUP BY
        b.OrderDate, b.Description) c ON rtr.CorpAcctName = c.Description

我们尝试并编写了以下脚本:

上面的脚本编译成 postgresql (VERSION HAWQ 1.3.1)

SELECT * from tablename_1  rtr LEFT OUTER JOIN
(SELECT SUM(b."OrderValue") as OrderValue,b."OrderDate", b."Description" from
(SELECT *  from tablename_2 rcd
LEFT JOIN 
( SELECT Distinct afv."Item", afv."Description", afd."KeyField"
FROM tablename_2 afd
  Join tablename_3 afv on afv."FormType" = afd."FormType" and afv."FieldName"=afd."FieldName" and afv."Item"=afd."AlphaValue"
Where   afd."FormType" = 'CUS'and afd."FieldName" = 'COR002') a
ON a."KeyField" =rcd."Customer" where "OrderDate">=TO_CHAR((CURRENT_DATE -(CURRENT_DATE-INTERVAL '1 DAY)) ,'MM-DD-YYYY')) b 
group by b."OrderDate", b."Description") c
on rtr."CorpAcctName"=c."Description"

还尝试过:

  • 当我们尝试将 ms sql server 转换函数转换为 postgres 以进行 orderdate 列比较时,OrderDate 必须反映为 'MM-01-YYYY'(期望的结果),这实际上是 '00-01-0000' 不想要的。相反,我们正在寻找结果为“2015 年 11 月 1 日”

**

  • 为了得到想要的结果,postgresql 中的 convert() 函数表达式是什么?

**

4

1 回答 1

1

我想从我的 current_date 实现每月的第一天

因此,您需要在本月开始之后创建的所有内容。

一个简单的

where "OrderDate" >= date_trunc('month', current_date)

会这样做。

该方法的详细信息date_trunc()可以在手册中找到:
http ://www.postgresql.org/docs/current/static/functions-datetime.html


您应该了解您的表达式TO_CHAR((CURRENT_DATE -(CURRENT_DATE-INTERVAL '1 DAY')) ,'MM-DD-YYYY')在做什么,以便将来避免该错误:

第一:从 a中current_date - interval '1 day'减去 an ,得到 a : "昨天" at 。intervaldatetimestamp00:00:00

然后从今天的日期中减去它,所以current_date - timestamp '2015-11-13 00:00:00.0'(如果今天是 2015-11-14)。

这会产生一个interval0 years 0 mons 1 days 0 hours 0 mins 0.00 secs

然后将其传递intervalto_char()格式化传递间隔的函数。由于它只有“1 天”,没有年份,没有月份,因此在其上应用格式字符串的结果'MM-DD-YYYY'确实 yield 00-01-0000

然后,您将此字符值与真实值进行比较date- 这也是您不应该做的事情。


你真的应该摆脱那些可怕的引用标识符。他们的麻烦比他们值得的要多得多

于 2015-11-14T11:25:50.197 回答