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 サーバーの convert 関数を postgres に変換して orderdate 列を比較しようとすると、OrderDate の比較は 'MM-01-YYYY' (望ましい結果) として反映される必要がありますが、これは実際には '00-01-0000' ではありません。 「11-01-2015」としての結果

**

  • 望ましい結果を得るための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')将来そのエラーを回避するために、式が何をしているのかを理解する必要があります。

最初に:から をcurrent_date - interval '1 day'減算し、: "昨日"を生成します。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'は実際に00-01-0000.

次に、この文字値を実数と比較しますが、dateこれも行うべきではありません。


これらの恐ろしい引用符付き識別子を本当に取り除く必要があります。彼らはそれだけの価値があるよりもはるかに厄介です

于 2015-11-14T11:25:50.197 に答える