PostgreSQLのタイムスタンプから日付(yyyy / mm / dd)を抽出します


250

PostgreSQLのタイムスタンプから日付部分だけを抽出したいのですが。

値が必要なDATE別のテーブルに挿入できるように、それをpostgresql 型にする必要がありDATEます。

たとえば、私が持っている場合2011/05/26 09:00:00、私は欲しい2011/05/26

キャストを試しましたが、2011年しか取得できません。

timestamp:date
cast(timestamp as date)

私が試しto_char()to_date()

SELECT to_date(to_char(timestamp, 'YYYY/MM/DD'), 'YYYY/MM/DD') 
FROM val3 WHERE id=1;

私はそれを機能させようとしました:

CREATE OR REPLACE FUNCTION testing() RETURNS void AS '
DECLARE i_date DATE;
BEGIN
    SELECT to_date(to_char(val1, "YYYY/MM/DD"),"YYYY/MM/DD") 
      INTO i_date FROM exampTable WHERE id=1;
    INSERT INTO foo(testd) VALUES (i);
END

PostgreSQLのタイムスタンプから日付(yyyy / mm / dd)を抽出する最良の方法は何ですか?

回答:


432

タイムスタンプの末尾にを付けると、日付にキャストできます::date。ここで、psqlでは、タイムスタンプです。

# select '2010-01-01 12:00:00'::timestamp;
      timestamp      
---------------------
 2010-01-01 12:00:00

次に、日付にキャストします。

wconrad=# select '2010-01-01 12:00:00'::timestamp::date;
    date    
------------
 2010-01-01

一方、date_trunc関数を使用できます。それらの違いは、後者はtimestamptzタイムゾーンをそのまま維持するように(必要な場合)同じデータ型を返すことです。

=> select date_trunc('day', now());
       date_trunc
------------------------
 2015-12-15 00:00:00+02
(1 row)

3
機能しません。「select '2010-01-01 12:00:00' :: timestamp :: date;」を試してみてください 。それはちょうど2011年を返します。私はすでにdate(timestamp)と(timestamp):: dateを試しましたが、年の部分しか返さず、必要な完全な日付は返されません。
ケレン2011年

1
@kerenk、今奇妙です。あなたはそれをpsqlで試しましたか?
ウェインコンラッド

40
@ keren、psqlはコマンドラインユーティリティです。使用していません(ただし考慮してください)。pgadmin3でクエリを実行するとき、データ出力ペインを見てください。列のサイズを変更できます。デフォルトの列サイズは、日付全体を表示するには短すぎ、年のみを表示します。マウスを使用してその列を展開すると、全体が表示されます。
ウェインコンラッド、

11
そうだね。私はとても愚かだ。指摘してくれてありがとう。
ケレン

これが機能しない場合に遭遇した1つのケースは、Squirrelです。この構文では、Squirrelはパラメーター ":date"のパラメーター値を入力するための入力ボックスを提供します。
James Kingsbery

104

日付関数を使用します

select date(timestamp_field) from table

文字フィールド表現から日付まで、次のものを使用できます。

select date(substring('2011/05/26 09:00:00' from 1 for 10));

テストコード:

create table test_table (timestamp_field timestamp);
insert into test_table (timestamp_field) values(current_timestamp);
select timestamp_field, date(timestamp_field) from test_table;

テスト結果:

pgAdminの結果

pgAdmin結果全体


1
私はそれを試しましたが、2011
/

タイムスタンプデータ型を使用していないことに気づきました。指定した形式のタイムスタンプの文字列表現で動作するように改訂されました。
James Allman、

SQLをどのように実行していますか?psql?
James Allman、

私は
pgAdmin

11
pgAdmin IIIでテストを実行すると、「日付」列が年を表示できるだけの幅になっていることに気付きました。列ハンドルをつかんで列を展開すると、完全な日付が表示されます。
James Allman、

10

あなたはそれを日付にキャストしようとしました<mydatetime>::dateか?


1
これは問題なく動作します。ウェインコンラッドの回答に関するコメントで述べたように、ケレンはpgAdminの出力ペインの極端に狭い列に惑わされていました。
KenB 2014

9

これはPython 2.7で私にとってはうまくいきます

 select some_date::DATE from some_table;

4
CREATE TABLE sometable (t TIMESTAMP, d DATE);
INSERT INTO sometable SELECT '2011/05/26 09:00:00';
UPDATE sometable SET d = t; -- OK
-- UPDATE sometable SET d = t::date; OK
-- UPDATE sometable SET d = CAST (t AS date); OK
-- UPDATE sometable SET d = date(t); OK
SELECT * FROM sometable ;
          t          |     d      
---------------------+------------
 2011-05-26 09:00:00 | 2011-05-26
(1 row)

別のテストキット:

SELECT pg_catalog.date(t) FROM sometable;
    date    
------------
 2011-05-26
(1 row)

SHOW datestyle ;
 DateStyle 
-----------
 ISO, MDY
(1 row)

私はpgAdminで試してみましたが、必要な2011年の日付ではなく、2011年の日付しかありません!:(
ケレン

@keren:SELECT pg_catalog.date( '2011/05/26 09:00:00'); ?
Grzegorz Szpetkowski、2011年

多分それは出力値をフォーマットすることと関係があります。戻り値にはおそらく日と月があると思いますが、画面に表示されませんか?
ケレン

SHOW datestyleと入力します。game me "ISO、DMY"
keren

4

ただやれselect date(timestamp_column)ば、日付部分だけが得られます。時には、それが部分を削除しない場所にselect timestamp_column::date戻るかもしれdate 00:00:00ません00:00:00。しかし、私はdate(timestamp_column)すべてのケースで完璧に機能することを見てきました。お役に立てれば。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.