ITPub博客

首页 > 数据库 > Oracle > [20181201]stamp 转化 time.txt

[20181201]stamp 转化 time.txt

原创 Oracle 作者:lfree 时间:2018-12-03 08:44:27 0 删除 编辑

[20181201]stamp 转化 time.txt


--//昨天看里面提到time到stamp的转化.

--//that expresses the time as the number of seconds since Jan 1988, with the unfortunate simplification that Oracle

--//thinks there are 31 days in every month of the year:


--//想起以前自己的一些错误.不过看看人家写time到stamp的转化,简单许多,自己按照国人的日期习惯修改如下:


WITH t1 AS (SELECT TO_DATE ('&&1', 'yyyy-mm-dd hh24:mi:ss') tt FROM DUAL)

SELECT tt time

      ,  round(86400

       * (    31

            * MONTHS_BETWEEN

              (

                 TRUNC (tt, 'MM')

                ,TO_DATE ('1988-01-01', 'yyyy-mm-dd')

              )

          + tt

          - TRUNC (tt, 'MM')),0)

          stamp

  FROM t1;


--//相比我以前从网上抄的,就比较麻烦:

$ cat convstamp.sql

SELECT  '&&1' time,(((((yyyy - 1988) * 12 + mm - 1) * 31 + dd - 1) * 24 + hh) * 60 + mi)* 60 + ss  stamp

  FROM (SELECT TO_CHAR (TO_DATE ('&&1', 'yyyy-mm-dd hh24:mi:ss'), 'yyyy')

                  yyyy

              ,TO_CHAR (TO_DATE ('&&1', 'yyyy-mm-dd hh24:mi:ss'), 'mm') mm

              ,TO_CHAR (TO_DATE ('&&1', 'yyyy-mm-dd hh24:mi:ss'), 'dd') dd

              ,TO_CHAR (TO_DATE ('&&1', 'yyyy-mm-dd hh24:mi:ss'), 'hh24') hh

              ,TO_CHAR (TO_DATE ('&&1', 'yyyy-mm-dd hh24:mi:ss'), 'mi') mi

              ,TO_CHAR (TO_DATE ('&&1', 'yyyy-mm-dd hh24:mi:ss'), 'ss') ss

          FROM DUAL);


--//另外可以提一下,stamp不是连续的,特别是闰年的2月跳跃更大.


SCOTT@test01p> @ convstamp '2018-02-28 23:59:59'

TIME                     STAMP

------------------- ----------

2018-02-28 23:59:59  969321599


SCOTT@test01p> @ convstamp '2018-03-01 00:00:00'

TIME                     STAMP

------------------- ----------

2018-03-01 00:00:00  969580800


--//969580800-969321599 = 259201,存在跳跃.


--//顺便贴上stamp转化到时间的语句.


$ cat stamp.sql

SELECT &&1 stamp,to_date(yyyy||'/'||mm||'/'||dd||' '||hh||':'||mi||':'||ss,'yyyy-mm-dd hh24:mi:ss') stamp_conv_time  from (

SELECT &&1

        ,FLOOR (&&1 / (86400*31*12))+1988 yyyy

        ,FLOOR (MOD (&&1 / (86400*31),12))+1 mm

        ,FLOOR (MOD (&&1 / 86400, 31))+1 dd

        ,FLOOR (MOD (&&1 / 3600, 24)) hh

        ,FLOOR (MOD (&&1 / 60, 60)) mi

        ,MOD (&&1, 60) ss

        from dual);


--//取969321599,969580800之间一个数值.

SCOTT@test01p> set verify off

SCOTT@test01p> @ stamp.sql 969580780

SELECT 969580780 stamp,to_date(yyyy||'/'||mm||'/'||dd||' '||hh||':'||mi||':'||ss,'yyyy-mm-dd hh24:mi:ss') stamp_conv_time  from (

                                                                             *

ERROR at line 1:

ORA-01839: date not valid for month specified

--//报如上错误.


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-2222414/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    2852
  • 访问量
    6640739