14

データベースに曜日と時間のフィールドがあります。日付と時刻を連結してタイムスタンプを取得したい。PostgreSQLでこれを行う方法は?

私はこれをしました:

SELECT EXTRACT(EPOCH FROM TIMESTAMP '2011-05-17 10:40:28');

そして、それはうまく機能しています。

しかし、日付と時刻のフィールドを置き換えようとすると、次のエラーが発生します。

SELECT EXTRACT(EPOCH FROM TIMESTAMP Day || ' ' || Time);
ERROR:  syntax error at or near "Day"
LINE 1: ...quest_count > 0 AND (EXTRACT(EPOCH FROM TIMESTAMP Day || ' ' || Time)) > (e...
4

3 に答える 3

23

datetime種類

yourDayが typedateで、 yourTimeがtype の場合time、非常に簡単な解決策があります。

SELECT EXTRACT(EPOCH FROM (day + time));

dateとを追加するだけtimeで a を取得できtimestamp [without time zone]ます (セッションのタイムゾーン設定に従って解釈されます)。

そして、厳密に言えば、エポックを抽出することは、質問自体とは無関係です。
date+time結果は 、timestampそれだけです。

文字列型

text文字列リテラルまたは/列について話している場合は、次varcharを使用します。

SELECT EXTRACT(EPOCH FROM ('2013-07-18' || ' ' || '21:52:12')::timestamp);

また

SELECT EXTRACT(EPOCH FROM cast('2013-07-18' ||' '|| '21:52:12' AS timestamp));

フォームが機能しませ

SELECT EXTRACT(EPOCH FROM TIMESTAMP ('2013-07-18' || ' ' || '21:52:12'));

これはうまくいきます:

SELECT EXTRACT(EPOCH FROM "timestamp" ('2013-07-18' || ' ' || '21:52:12'));

タイプキャストに関するマニュアルを引用します:

関数のような構文を使用して型キャストを指定することもできます。

typename ( expression )

ただし、これは、名前が関数名としても有効な型に対してのみ機能します。たとえば、double precisionこのように使用することはできませんが、同等のものは使用float8できます。intervalまた、 、time、および という名前は、構文上の競合のため、timestamp二重引用符で囲まれている場合にのみこの方法で使用できます。したがって、関数のようなキャスト構文を使用すると矛盾が生じるため、おそらく避けるべきです。

大胆強調鉱山。
その要点: 代わりに、最初の 2 つの構文バリアントのいずれかを使用します。

于 2013-07-18T19:50:52.473 に答える
17
SELECT EXTRACT(EPOCH FROM (Day || ' ' || Time)::timestamp);
于 2013-07-18T14:13:18.307 に答える