oracle number转为timestamp timestamp转number

oracle number转为timestamp timestamp转number现在平台有个字段是用来记录插入时间的,但是是用number型存储,想转为时间类型的。结果:SELECTTO_CHAR(字段名/(1000*60*60*24)+TO_DATE(‘1970-01-0108:00:00′,’YYYY-MM-DDHH24:MI:SS’),’YYYY-MM-DDHH24:MI:SS’)ASCDATE FROM表名;解决

大家好,又见面了,我是你们的朋友全栈君。

现在平台有个字段是用来记录插入时间的,但是是用number型存储,想转为时间类型的。
结果:
SELECT TO_CHAR(字段名 / (1000 * 60 * 60 * 24) + TO_DATE(‘1970-01-01 08:00:00’, ‘YYYY-MM-DD HH24:MI:SS’), ‘YYYY-MM-DD HH24:MI:SS’) AS CDATE   FROM 表名;
解决问题的过程:
http://blog.csdn.net/a9529lty/article/details/5306622

ORACLE 毫秒转换为日期 日期转换毫秒
日期转换毫秒
SELECT TO_NUMBER(sysdate –  TO_DATE(‘1970-01-01 8:0:0’, ‘YYYY-MM-DD HH24:MI:SS’)) * 24 * 60 * 60 * 1000  FROM DUAL;
SELECT TO_NUMBER(TO_DATE(‘2005-03-29 12:30:45’, ‘YYYY-MM-DD HH24:MI:SS’) –  TO_DATE(‘1970-01-01 8:0:0’, ‘YYYY-MM-DD HH24:MI:SS’)) * 24 * 60 * 60 * 1000  FROM DUAL;

毫秒转换日期
SELECT TO_CHAR(1112070645000 / (1000 * 60 * 60 * 24) +  TO_DATE(‘1970-01-01 08:00:00’, ‘YYYY-MM-DD HH24:MI:SS’), ‘YYYY-MM-DD HH24:MI:SS’) AS CDATE   FROM DUAL;
SELECT TO_CHAR(1336986532000  / (1000 * 60 * 60 * 24) + TO_DATE(‘1970-01-01 08:00:00’, ‘YYYY-MM-DD HH24:MI:SS’), ‘YYYY-MM-DD HH24:MI:SS’) AS CDATE   FROM dual ;

在Oracle中,默认没有直接提供获取当前时间的毫秒数的相关function,所以要想在SQL里面获得毫秒数,只好手动计算

SQL> select to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) current_date, (sysdate- to_date(‘1970-01-01′,’yyyy-mm-dd’)) * 86400000 current_milli from dual;

CURRENT_DATE              CURRENT_MILLI
——————-                    ————-
2009-01-06 14:00:09       1231250409000
–1000*60*60*24一天毫秒数 = 86400000
方法:
日期a- 日期b=相差天数.
一天毫秒数 = 1000*60*60*24(86400000)
select to_char(sysdate, ‘yyyy-mm-dd hh24:mi:ss’) current_date,(sysdate – to_date(‘1970-01-01′,’yyyy-MM-dd’)) * 86400000 current_milli  from dual;
select to_date(‘1970-01-01′,’yyyy-MM-dd’)+1261674301000/86400000 from dual;
select to_date(‘1970-01-01′,’yyyy-MM-dd’)+当前日期的毫秒数/86400000 from dual;
http://space.itpub.net/8554499/viewspace-659931

ORACLE中用SQL实现时间日期由毫秒数到字符串的转换
在开发过程中,为了方便,经常将时间日期的毫秒数以整形的格式存到数据库中,虽然方便了不同地方的处理,但也会增加些麻烦。比如,我要到数据库里直接看某个时间的值,都是一长串的数字,鬼都看不懂,想到看到该字段的值,还要写个转换程序,把毫秒数在转换成日期时间类型,或者拿个计算器来算。要查看的记录少,还能将就,如果多了,那不崩溃才怪呢。于是想到了在SQL里直接转换的方法,还好牛人多,在网上搜了一下,还真有相关的东西,原始的语句如下: 
SELECT TO_CHAR(SYSDATE,’YYYY-MM-DD HH24:MI:SS’) CURRENT_DATE, (SYSDATE- TO_DATE(‘1970-01-01′,’YYYY-MM-DD’)) * 86400000 CURRENT_MILLI FROM DUAL;

这只是个例子,还不能直接解决上面的问题,所有就改了一下,是以自定义函数的形式存在的,代码如下:
CREATE OR REPLACE FUNCTION DATELONG2TEXT (PARAM IN LONG) RETURN VARCHAR2 AS
V_TEXT VARCHAR2(64);
BEGIN
SELECT TO_CHAR(TO_DATE(‘1970-01-01’, ‘YYYY-MM-DD’)+(PARAM/(24*60*60*1000) + 8/24 – 1/86400),’YYYY-MM-DD HH24:MI:SS’) INTO V_TEXT FROM DUAL;
RETURN V_TEXT;
END DATELONG2TEXT;
使用示例:
SELECT TO_CHAR(SYSDATE, ‘YYYY-MM-DD HH24:MI:SS’),SYSDATE,DATELONG2TEXT((SYSDATE – 8 / 24 – TO_DATE(‘1970-01-01’, ‘YYYY-MM-DD’)) * 86400000) FROM DUAL;
说明:
1、加上 8/24 ,是因为时间格式是GMT,结果会受时区的影响,我们在东8区,所以要加上8个小时 ;
2、减1/86400,至于为什么,我也说不清楚,只是在实际当中确实多了1秒,只好以这种方式减去了,根据时间情况确定是否进行调整。
当然,我们也可以类似的写出将日期由字符串转换成毫秒数的函数。

http://hi.baidu.com/78347079/blog/item/14a05afd868d291f08244d15.html

ORACLE自动插入当前时间的年月日YYYY-MM-DD格式的实现

oracle没有date()函数,sysdate函数的值是包括时分秒的,要实现插入当前时间默认值还真麻烦.

只好自己写储存过程,而字段默认值里面又不能调用储存过程,还得写个触发器!而储存过程里面取出来的sysdate前几位的只却变成17-11月-07的格式了,不是自己想要的,2007-11-17的格式,又得单独取年月日再组合起来,这样一来返回值就不能是日期类型而要字符类型了.

一个字,烦!不过还是把他实现了.下面把代码给大家分享一下,如果有更好的方法麻烦告知.

1.储存过程

CREATE OR REPLACE FUNCTION “GET_DATE” RETURN VARCHAR2

IS

   yyyy     varchar2(36);

   mm     varchar2(36);

   dd     varchar2(36);

   tempdate   varchar2(36);

BEGIN

tempdate := ”;

select to_char(to_date(sysdate),’YYYY’) into yyyy from dual;

select to_char(to_date(sysdate),’MM’) into mm from dual;

select to_char(to_date(sysdate),’DD’) into dd from dual;

tempdate := substr(yyyy,1,4)|| ‘-‘||

substr(mm,1,2)|| ‘-‘||

substr(dd,1,2)

;

return tempdate;

END;

2.触发器

CREATE OR REPLACE TRIGGER STATWEEK_tg

–STATWEEK fdate 的触发器

BEFORE INSERT ON STATWEEK FOR EACH ROW

BEGIN

       SELECT get_date INTO :NEW.fdate FROM DUAL;

END;

注:这里的STATWEEK为对应的数据表 fdate为自动增长的字段,get_date为对应的储存过程名.

3.数据表

— Create table

create table STATWEEK

(

星期一   VARCHAR2(20) default 0,

星期二   VARCHAR2(20) default 0,

星期三   VARCHAR2(20) default 0,

星期四   VARCHAR2(20) default 0,

星期五   VARCHAR2(20) default 0,

星期六   VARCHAR2(20) default 0,

星期日   VARCHAR2(20) default 0,

TWEEK VARCHAR2(10),

ADMIN VARCHAR2(50),

FDATE VARCHAR2(20)

)

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163916.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月24日 上午10:36
下一篇 2022年7月24日 上午10:36


相关推荐

  • MySql必知必会实战练习(六)游标

    游标主要用于交互式应用,滚动屏幕上的数据,并对数据进行浏览或做出更改看一下下面的例子:输出:由于结果为多行无法显示,这时我们就需要使用游标来操作1.游标基本方法(1)创建游标(2)打开游

    2021年12月29日
    40
  • LinkedHashMap 详解

    LinkedHashMap 详解一 概述概括的说 LinkedHashMa 是一个关联数组 哈希表 它是线程不安全的 允许 key 为 null value 为 null 它继承自 HashMap 实现了 Map K V 接口 其内部还维护了一个双向链表 在每次插入数据 或者访问 修改数据时 会增加节点 或调整链表的节点顺序 以决定迭代时输出的顺序 默认情况 遍历时的顺序是按照插入节点的顺序 这也是其与 HashMap 最 K V

    2026年3月18日
    2
  • 腾讯回应抄袭龙虾,给我看笑了

    腾讯回应抄袭龙虾,给我看笑了

    2026年3月13日
    2
  • 什么是前端跨域,怎么解决跨域问题

    什么是前端跨域,怎么解决跨域问题什么是跨域?跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。所谓同源是指:域名,协议,端口均相同,不明白没关系,举个栗子:http://www.123.com/index.html调用http://www.123.com/server.php(非跨域)http://www.123.com/index.html调用http://www.456.com/server.php(主域名不同:123/456,跨域)http://abc.1

    2022年6月3日
    44
  • 51单片机控制TB6600驱动器驱动42步进电机「建议收藏」

    51单片机控制TB6600驱动器驱动42步进电机「建议收藏」51单片机控制TB6600驱动器驱动42步进电机功能实现目标硬件简介硬件连接程序代码功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与…

    2022年5月20日
    60
  • 《科研诚信与学术规范》参考答案最新版

    《科研诚信与学术规范》参考答案最新版研究人员在通过大众传媒传播自己已经发表的研究成果时,以下哪一个表述不正确:1.11【单选题】为了确保学术和科研(),多大学制定了荣誉法则。A、效率B、质量C、风格D、诚信正确答案:D我的答案:D2【判断题】大学建立荣誉制度的初衷旨在预防大学生考试作弊。正确答案:√我的答案:√3【判断题】科学研究与学术工作与人类其他活动一样,均建立在诚信之上。正确答案:√我的答案:√4【判断题】很多大学制定了荣誉法则的目的是为了确保学术和科研诚信。…

    2022年5月22日
    65

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号