2012-06-05 80 views
0

如何將這些數字列(timestamp,event_dt)轉換爲日期或時間掩碼? 我想這一點:oracle將時間戳轉換爲其他時間掩碼

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 

回答

5

首先,從不存儲日期或時間戳記數據類型除日期或時間戳列以外的任何其他數據類型。它不會導致痛苦的結束;當你在收集。因爲你的「時間戳」有11個數量級,我會猜測你是以yyyymmddhh24mi的形式插入它們的,而且它們不是自未指定的時代或類似事件以來的秒數。

如果你想轉換它,那麼你必須首先將它們轉換成一個字符,然後轉換爲日期。您實際上並不需要時間戳,因爲這些日期僅在小數秒內與日期不同。

它會看起來像下面這樣:

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

在一個側面說明從未呼叫列時間戳,日期,團體或其他保留字。它造成太多問題。就我個人而言,我通常會選擇「tamp」,但這只是個人偏好。

如果你想將你的「時間戳」轉換成一個字符,你就必須再次將它轉換成一個字符。

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()在這種情況下,天級截斷這一點。

+0

謝謝本指針。這非常有幫助。 – cjd143SD

2

首先,存儲日期和時間戳在不DATETIMESTAMP差數據建模列。如果您將數據存儲在具有適當數據類型的列中,生活會更容易。

其次,您的數字列用於存儲日期和/或時間戳數據的格式是什麼?您不會發布實際值的示例 - 我們所知的全部是12位數字,從2011年開始。我會猜測它們以YYYYMMDDHH24MI格式存儲,沒有秒 - 您需要告訴我們如果這種猜測碰巧不正確。

假設猜測是正確的,您需要將數字轉換爲字符串,將字符串轉換爲日期,然後將日期轉換爲其他格式的另一個字符串。顯然,這有點尷尬(以及將事物存儲在適當數據類型中的衆多原因之一)。像

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

的東西,如果你的數字列存儲不同的或者有沒有數據存儲在正確格式的情況下,生活變得更加不舒服。