0

これらの数値列(timestamp、event_dt)を日付または時刻マスクに変換するにはどうすればよいですか?私はこれを試しています:

    select to_char(timestamp,'YYYY-MON-DD HH24:MI:SS'), domain_c, to_char(event_date,'YYYY-MON-DD HH24:MI:SS'), total_reads from TOP_READ_EVENTS where timestamp= to_char(sysdate-2,'yyyymmdd') || '0000'
                         *
ERROR at line 1:
ORA-01481: invalid number format model


SQL> desc top_read_events;
 Name                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 YEAR                           NUMBER
 QUARTER                        NUMBER
 MONTH                          NUMBER
 DAY                            NUMBER
 HOUR                           NUMBER
 TIMESTAMP                      NUMBER
 DOMAIN_C                       VARCHAR2(255)
 EVENT_DT                       NUMBER
 TOTAL_READS                        NUMBER




select timestamp, domain_c, event_dt, total_reads from TOP_READ_EVENTS where timestamp= to_char(sysdate-2,'yyyymmdd') || '0000'    

 TIMESTAMP DOMAIN_C              EVENT_DT  TOTAL_READS
---------- ------------------------------  ------------ -------------
2.0111E+11 b.e.att-mail.com         2.0111E+11         14406
2.0111E+11 bounce.emailinfo2.bestbuy.com    2.0111E+11         14156
2.0111E+11 bounce.bluestatedigital.com      2.0111E+11         13701
2.0111E+11 plentyoffish.com         2.0111E+11         13384
2.0111E+11 mail.classmates.com          2.0111E+11         13281
2.0111E+11 comcast.net              2.0111E+11         13241
2.0111E+11 uniquelistsmail.com          2.0111E+11         13135
2.0111E+11 tankgorilla.com          2.0111E+11         12835
2.0111E+11 frigidphoenix.com            2.0111E+11         12657
4

2 に答える 2

5

まず、日付またはタイムスタンプのデータ型を日付またはタイムスタンプの列以外に格納しないでください。それは痛みの終わりを引き起こしません。あなたが集まっているように。

あなたの「タイムスタンプ」は11桁あるので、フォームyyyymmddhh24miに挿入したと推測します。不特定のエポックなどから数秒ではありません。

これを変換したい場合は、最初に文字に変換し、次に日付に変換する必要があります。タイムスタンプは日付とわずかな秒数でのみ異なるため、実際にはタイムスタンプは必要ありません。

次のようになります。

select to_date(to_char(timestamp),'yyyymmddhh24mi') as my_timestamp
  from top_read_events

補足として、列のタイムスタンプ、日付、グループ、または別の予約語を呼び出さないでください。それはあまりにも多くの問題を引き起こします。個人的には通常「スタンプ」を選びますが、それは個人的な好みです。

「タイムスタンプ」を文字に変換する場合は、もう一度文字に変換する必要があります。

select to_char(to_date(to_char(timestamp)
                       ,'yyyymmddhh24mi')
              ,'yyyy-mon-dd hh24:mi:ss') as my_timestamp
  from top_read_events

00あなたがこれらを持っていないので、秒は常になります。明示的な数値から文字、日付、文字への変換のみを使用していることに注意してください。2年後の自分も含めて、あなたの後に来るコーダーにとってはより明白になり、通訳が意図を間違えたり、数字を文字と比較したりする可能性はありません。

このため、私は間違いなく変更しwhere timestamp= to_char(sysdate-2,'yyyymmdd') || '0000'ます。日付の比較をしたいので、これを日付に変更し、そのように変更します。

where trunc(to_date(to_char(timestamp),'yyyymmddhh24mi'),'dd') = trunc(sysdate -2)

trunc()この場合、これを日レベルで切り捨てます。

于 2012-06-05T20:19:03.833 に答える
2

まず、データモデリングが不十分DATEまたは不十分な列に日付とタイムスタンプを保存します。TIMESTAMP適切なデータ型の列にデータを格納すると、作業がはるかに楽になります。

次に、日付やタイムスタンプのデータを格納するために数値列を使用している形式は何ですか?実際の値の例を投稿しないでください。12桁で2011年から始まることがわかっています。これらは、秒なしでYYYYMMDDHH24MIの形式で保存されていると思います。その推測がたまたま間違っていたら、私たちに。

推測が正しいと仮定すると、数値を文字列に変換し、文字列を日付に変換してから、日付を別の形式の別の文字列に戻す必要があります。明らかに、これは少し厄介です(そして、適切なデータ型に物事を格納する多くの理由の1つです)。何かのようなもの

to_char( to_date( to_char( timestamp ), 
                  'YYYYMMDDHH24MI' ),
         'YYYY-MON-DD HH24:MI:SS' )

数値列の保存方法が異なる場合や、データが正しい形式で保存されていない場合は、生活がさらに快適になりません。

于 2012-06-05T20:18:25.937 に答える