2012-01-04 6 views
8

Postgresでは、タイムスタンプのデフォルト書式マスクを変更できますか?私はto_char() asかによってsubstr()でストリップダウンして個々の列でこれを行うことができます知っているは、タイムスタンプのデフォルトの書式をセッションごとに、またはグローバルに設定できますか?

2012-01-03 20:27 

が今

2012-01-03 20:27:53.611489 

として戻ってくる私はこのような分の解像度を希望します受信アプリケーションは、最初に正しくフォーマットされていれば、多くの作業を節約し、多くのエラーを減らすことができます。

+0

クライアント・アプリケーションを使用しているの? –

+0

phpのプロトタイプ、約6ヶ月でnode.jsに移動 –

+0

これはPostgresの設定ではなく、変更するPHPの設定になります。 –

答えて

4

ポストグルでは、です。set datestyleオプションを使用して、日付時刻のデフォルトのフォーマットマスクを変更します。使用可能なオプションはhereです(8.5.2。日付/時刻出力を参照)。

残念ながら、使用できるすべてのオプションには秒数が含まれているため、クエリまたはアプリケーションコード(該当する場合)のいずれかで再フォーマットする必要があります。

+0

あなたは私が見つけたものを見つけています - ありがとう –

3

to_char()は、文字列リテラルの作成に使用されます。あなたが別のタイムスタンプ値、使用したい場合:入力については

date_trunc('minute', now()) 

を使用することができますマスク:timestamp without time zone

to_timestamp('2012-01-03 20:27:53.611489', 'YYYY-MM-DD HH24:MI') 

キャストを::timestampを追加することによって。

私の知る限り、PostgreSQLでは、タイムスタンプリテラルからの秒数をデフォルトで減らす設定はありません。

+0

ありがとうございますが、問題はタイムスタンプの値ではなく、選択時の文字列表現です。このアプリでは、ユーザーに提示されたタイムスタンプは常に最も近い分に丸められます - データではなく、表示と関係します。それぞれのselectの各カラムに 'to_char()'を付けずにこれを行う方法を探していました。 –

+1

@ccyoung:**丸め**を最も近い分にしたい場合は、 'to_char()' connotも役に立ちます。あなたはそれだけで切り捨てることができます。とにかく、これはデータベースのためではなく**クライアント**の仕事のように聞こえます。 a_horse_with_no_nameは正しい軌道にあります。 –

+0

理論的には、理論的には正しいかもしれませんが、実際にはほとんどの場合、日付の書式設定と算術演算はSQLに入れています.JavaScriptやPHPよりもはるかに優れているからです。 –

8

PostgreSQLでは、タイムスタンプのフォーマットはストレージに依存しません。

select to_char(current_timestamp, 'yyyy-MM-dd HH24:MI:SS.MS'); 

select to_timestamp('2012-10-11 12:13:14.123', 
    'yyyy-MM-dd HH24:MI:SS.MS')::timestamp; 

しかし、あなたはデフォルト書式を設定する必要がある場合:

変更PostgreSQLのタイムスタンプ一つの答えは、このように、あなたがそれを必要とする瞬間にto_charを使用して何が必要なフォーマットにタイムスタンプをフォーマットすることですグローバル形式:

は、あなたのタイムゾーンを見てみましょうSQLクエリとしてこれを実行します。

show timezone 
Result: "US/Eastern" 

ですから、CURRENT_TIMESTAMPをプリントアウトしているとき、あなたがこの参照してください。最後に

select current_timestamp 
Result: 2012-10-23 20:58:35.422282-04 

-04をUTCにタイムゾーンの相対的です。その後

set timezone = 'US/Pacific' 

:あなたとあなたのタイムゾーンを変更することができます

select current_timestamp 
Result: 2012-10-23 18:00:38.773296-07 

をので-07たちは太平洋が7時間の距離UTCからであることを意味し、そこに注意してください。見苦しいタイムゾーンを消し去るにはどうすればいいですか?あなたがそのテーブルにタイムスタンプを追加し、それから

select fail_date from worse_than_fail_table 
Result: 2012-10-23 21:09:39.335146 

イェーイ、上ノータイムゾーンを選択した場合、

CREATE TABLE worse_than_fail_table 
(
    mykey   INT unique not null, 
    fail_date  TIMESTAMP not null 
); 

:一つの方法は、それは、単にテーブルを作るためにタイムゾーンなしのタイムスタンプデフォルトであります終わり。しかし、デフォルトでタイムスタンプがどのように表示されるかをもっとコントロールしたいと思っています。

CREATE TABLE moo (
    key  int PRIMARY KEY, 
    boo  text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM') 
); 

それはあなたがselect somecolumns from sometableを行うときに、それがデフォルトで現れる方法をより詳細に制御できますテキストフィールドです:あなたはこのような何かを行うことができます。あなたはタイムスタンプに文字列をキャストすることができます注意してください:

select '2012-10-11 12:13:14.56789'::timestamp 
Result: 2012-10-11 12:13:14.56789 

あなたはタイムゾーンを除去するtimestampにCURRENT_TIMESTAMPをキャストすることができます:

select current_timestamp::timestamp 
Result: 2012-10-23 21:18:05.107047 

あなたはこのような時間帯を取り除くことができます:

select current_timestamp at time zone 'UTC' 
Result: "2012-10-24 01:40:10.543251" 

しかし、タイムゾーンを元に戻したい場合は、これを行うことができます:

select current_timestamp::timestamp with time zone 
Result: 2012-10-23 21:20:21.256478-04 

あなたが抽出して欲しいものをヤンクすることができます

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40'); 
Result: 20 

そして、この怪物:

SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'EST'; 
Result: 2001-02-16 20:38:40