4

dateandフィールドを持つテーブルがありtimeます。時間を数値に変換する方法を理解していないため、これをどのように処理するかを理解するのに苦労しています。次のコマンドを使用してテーブルを作成しました。

CREATE TABLE tracking.time_record
(
  date date, 
  "time" time without time zone,
  id character(100)
)

私のデータの例は次のとおりです。

"2012-04-18" | "18:33:19.612" | "2342342384" 

たとえば、特定の日idの時間値を持つすべての値を調べることができるようにクエリを実行するにはどうすればよいですか?> 10 pm

私の時間は文字型変数に格納されているため、次のようなものは機能しないことに気付きました:

SELECT * FROM tracking.time_record 
WHERE "time" > "04:33:38.884" AND date > "2012-04-18"

(これは、時間/日付の追跡に関する私の最初の調査です。おそらく別の列名を選択する必要がありました)

4

3 に答える 3

10

これまでのところ、どちらの回答も実際の問題を捉えていません。

適切な型への明示的なキャストは確かに害はありませんが、必須ではありません。PostgreSQL は、文字列リテラルを適切な型に自動的に変換します。

あなたの問題は基本的な構文エラーから生じます:二
重引用符識別子用です: 一重引用符用です: ."MyColumn"
'string literal'

PostgreSQL マニュアルの識別子定数についてよく書かれた章に興味があるかもしれません。

その間、またはを列名として使用しないでください。どちらもすべての SQL 標準で予約語であり、PostgreSQL では型名です。これにより、紛らわしいコードとエラー メッセージが表示されます。datetime

timestamp個別の and の代わりに単一の列を使用することをお勧めしますdateand time: そして、ほとんどの場合character(100)、データ型としては必要ありませ-特にid列の場合はそうではありません. この空白が埋め込まれたタイプは、基本的に歴史的な理由からのみ存在します。検討textするか、varchar代わりに:

次のようになります。

CREATE TABLE tbl (
   tbl_id text CHECK(length(id) <= 100)
 , ts timestamp
);

これらのコンポーネントのみが必要な場所にキャストしtimeます。短くて安価です。date

SELECT ts::time AS the_time, ts::date AS the_date FROM tbl;

より具体的なニーズにはdate_trunc()またはを使用します。特定の日の午後 10 時を超える時間値を持つ ... id 値を照会するには:extract()

SELECT *
FROM   tbl
WHERE  ts::time > '22:00'
AND    ts::date = '2012-04-18';

または、任意の連続した期間について:

...
WHERE  ts > '2012-04-18 22:00'::timestamp
AND    ts < '2012-04-19 00:00'::timestamp;

2 番目の形式は、単純なインデックスをtsより適切に使用でき、大きなテーブルのような場合に高速になります。

timestampPostgreSQL での処理の詳細:

于 2012-04-25T05:53:21.290 に答える
4

date_part関数を使用して時間を取得できます

select id 
from tracking.time_record
where date_part('hour', time) >= 22
  and date = '2012-04-18'

> 22 の代わりに >= 22 を使用すると、午後 10 時から午後 11 時までの間隔を取得できます。これも午後 10:00:00 をキャッチします。しかし、適切な間隔をキャッチするためにクエリを適応させることは難しくありません

ここに実用的な例があります。

于 2012-04-24T13:26:54.067 に答える
3

時刻と日付の値の比較は、postgresql で正常に機能するはずですが、文字列を適切な型に変換することを確認してください。

SELECT * FROM tracking.time_record 
WHERE "time" > time '04:33:38.884' AND "date" > date '2012-04-18'
于 2012-04-24T13:36:46.040 に答える