2016-05-01 5 views
0

私は二つの小さな奇妙として皆さんに来ているが、私はpostgresのを理解して見えることはできません。倒錯変態[唯一の条件句では動作しません負の日付間隔とエイリアス]

( 1)

SELECT "LASTREQUESTED", 
     (DATE_TRUNC('seconds', CURRENT_TIMESTAMP - "LASTREQUESTED") 
       - INTERVAL '8 hours') AS "TIME" 
    FROM "USER" AS u 
    JOIN "REQUESTLOG" AS r ON u."ID" = r."ID" 
ORDER BY "TIME" 

result

ユーザーは自分の次の要求[回8時間]を作ることができたとき、私は計算していますが、あなたは、エントリ16を見れば、私は1日-06」を取得:20:47 "18時00分" ishの代わりに、他のすべての行とは異なります。 [テーブルLASTREQUESTEDはシンプルなタイムスタンプですが、ここでは16行目の他のエントリとは違いはありません。なぜそうですか?同じリクエストで

(2)

私は「TIME」列に条件を追加しようとした場合、コンパイラがで注文することを使用してOKですが、それは存在しないと言います。私は理由を知りません。

SELECT (DATE_TRUNC('seconds', CURRENT_TIMESTAMP - "LASTREQUESTED") 
       - INTERVAL '8 hours') AS "TIME" 
    FROM "USER" AS u 
    JOIN "REQUESTLOG" AS r ON u."ID" = r."ID" 
    WHERE "TIME" > 0 
ORDER BY "TIME"; 
+0

2つの異なる質問が2つの異なる質問の投稿に入るはずだと思います。 –

+0

質問#2は[この他の質問](http://stackoverflow.com/q/3241352/3004881)の複製であるようです。 –

答えて

1

質問#1:負の時間ですが正の日ですか?

PostgreSQL documentationによると、これは、PostgreSQLはSQL標準とは異なり状況です:

SQL標準によると、間隔値のすべてのフィールドは、同じ符号を持っている必要があります...。 PostgreSQLはフィールドに異なる記号を付けることができます。

内部的な間隔の値は、月、日、秒として保存されます。これは、1か月の日数が異なるために行われ、夏時間の調整が行われている場合は、1日に23時間または25時間かかる場合があります。月と日のフィールドは整数で、秒のフィールドは分数を格納できます。 ...

あなたは次のクエリでこれのより極端な例を見ることができます:

=# select interval '1 day' - interval '300 hours'; 
    ?column?  
------------------ 
1 day -300:00:00 
(1 row) 

は、これは奇妙な方法で表現秒で、単一の間隔ではありません。代わりに、0ヶ月、+1日、および-1,080,000.0秒の間隔です。

=# select justify_hours(interval '1 day' - interval '300 hours'); 
    justify_hours  
-------------------- 
-11 days -12:00:00 

質問:あなたはあなたからこれらの間隔を得たタイムスタンプとは夏時間の問題がありませんことを特定している場合は、24時間の期間に日数を変換し、より理にかなって間隔を取得するためにjustify_hoursを使用することができます#2:でSELECTの列を使用できませんか?

これは標準的なPostgreSQLの動作です。 this duplicate questionを参照してください。

  • 繰り返し表現を二度、一度SELECTリストで、再度WHERE句で:ソリューションが含ま提示しました。

    SELECT (my - big * expression) AS x 
    FROM stuff 
    WHERE (my - big * expression) > 5 
    ORDER BY x 
    
  • はそのWHEREフィルターなしでサブクエリを作成し、外部クエリ

    SELECT * 
    FROM (SELECT (my - big * expression) AS x 
         FROM stuff) AS subquery 
    WHERE x > 5 
    ORDER BY x 
    
  • 使用aにWHERE条件を置く(私は...覚えておきたいよりも、この回以上やりました) WITHステートメントは、サブクエリトリックと同様のものを実現します。

+0

ありがとう、非常に洞察力があった! – aurawastaken

0

(あなたは別の間隔から間隔を引くかもしれないので)私は今まさに、なぜあるとして、計算していますしませんが、あなたがタイムスタンプマイナスタイムスタンプに計算を変更すると、それが期待どおりに動作:

​​ 標準SQLに基づいて選択リスト内の列は、/ GROUP BYは/ HAVINGが、ORDER前に、それはだあなたがエイリアスを使用できない理由WHERE/FROMの後に計算されます。

#2についてFiddle

を参照してください。 。 Itzik Ben-Gan(MS SQL Serverに基づいていますが、PostgreSQLでも同様)によって書かれたgood articles on that topicがあります。

+0

パーフェクト!ありがとう! – aurawastaken

関連する問題