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

附带说明,永远不要调用列时间戳、日期、组或其他保留字。它导致了太多的问题。就我个人而言,我通常会选择“tstamp”,但这只是个人喜好。

如果要将“时间戳”转换为字符,则必须再次将其转换为字符。

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

首先,将日期和时间戳存储在不是数据建模DATETIMESTAMP数据建模不佳的列中。如果您将数据存储在具有正确数据类型的列中,生活会容易得多。

其次,您的数字列使用什么格式来存储日期和/或时间戳数据?您没有发布实际值的示例——我们所知道的是它们是 12 位数字并从 2011 年开始。我猜它们以 YYYYMMDDHH24MI 格式存储,没有秒数——你需要告诉如果这个猜测碰巧是不正确的。

假设猜测是正确的,您需要将数字转换为字符串,将字符串转换为日期,然后将日期转换为不同格式的另一个字符串。显然,这有点尴尬(也是将事物存储在正确数据类型中的众多原因之一)。就像是

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

如果您的数字列存储方式不同,或者存在数据未以正确格式存储的任何情况,那么生活就会变得更加不愉快。

于 2012-06-05T20:18:25.937 回答