年 月 日 时 分 秒 时区 用小时表示的相对于 UTC 的时差 用分钟表示的相对于 UTC 的时差

date 存储日期和时间, 不带时区, 精确到秒

timestamp 存储日期和时间, 不带时区, 时间精度可以达到10亿分之一秒, 小数点后9位. 除了精度这一点之外, TIMESTAMP 和 DATE 相同

timestamp with timezone 存储时区, 日期和时间, 精度达到小数点后 9 位

timestamp with local timezone 保存日期和精确到小数点后 9 位, 这个数据类型对时区敏感, 这个类型的值会自动在数据库所在时区及当地时区(会话端)之间转化. 这个值保存到数据库时, 也会转换成数据库时区, 而不是保存本地(会话)时区. 当从数据库提取数据时, 这个值又会从数据库的时区转换成本地(会话)时区.

例如: 在全世界范围内开会, 因为大家时区不同, 而此时你选用这种类型, 比如你规定几点开会, 那么就会按照你所在的时区变更时间到跟你时区相匹配的时间. 这样, 用户自己本身就不用计算复杂的时区转换逻辑, 而由数据库自己完成. (数据库会自动变更时间匹配到你的时区)

UTC 00, 标准时间, 各个时区都是参考这个00, + 或 - 相对时区. 所以, 如果选择这个类型, 可以把数据库时区设置成这个时间. UTC

声明日期和时间变量

var_name [constant] datetime_type [:= | default initial_value]

选择日期时间数据类型

面对这么多类型, 什么时候使用什么类型 ?

  • 如果对时间要求到小数的秒, 则可以选择 TIMESTAMP
  • 如果希望数据库能够自动在数据库时区和会话时区之间进行时间转换, 使用TIMESTAMP WITH LOCAL TIME ZONE
  • 如果希望跟踪数据入口的会话时区, 使用 timestamp with time zone.
  • 我们可以使用 timestamp 类型代替 date类型, 一个不带亚秒精度信息的 timestamp 会占用 7个字节, 和date一样, 如果 timestamp 带有压秒数据, 就会占用 11 个字节的存储空间.

其他一些考虑:

  • 要是必须和 timestamp 数据类型出现之前的已有应用程序相兼容, 就的使用 DATE 类型.
  • 如果使用数据库是 oracle 9i 以前的版本, 我们别无选择只能用 DATE 类型.

就以上函数使用的场合:

1. oracle 8i 以前, 我们只能选择 sysdate

2. 你所感兴趣的到底是数据库的时间还是会话的时间, 如果是会话时间, 那么返回会话时区, 如果是数据库时间, 那么返回数据库时区

3. 返回日期和时间中是否需要时期, 如果需要就要选择 current_timestamp 和 systimestamp

另外, 你要保证会话所在时区和数据库时区的正确性, 函数 sessiontimezone 和 dbtimezone 分别报告你的会话时区和数据库时区.

begindbms_output.put_line('session timezone=' || sessiontimezone);dbms_output.put_line('session timestamp=' || current_timestamp);dbms_output.put_line('db server timestamp=' || systimestamp);-- 结果 +08:00dbms_output.put_line('db timezone=' || dbtimezone); -- 结果 00:00execute immediate 'alert session set time_zone=dbtimezone';dbms_output.put_line('db timestamp=' || current_timestamp);execute immediate 'alert session set time_zone=local';
end;

注意, 这里有一点要特别注意, 虽然调用systimestamp 显示的是数据库的时区, 这个时区是真正时区, 例如数据库在北京, 这个时区可以是 +08:00, 但是我们设置 db time zone 时, 要设置 00, 因为这样, 当真正需要 local time 转换时, 转换方便.

interval 数据类型 时间间隔

interval year to month 用年和月定义时间间隔

interval day to second 用天, 小时, 分钟, 秒(包括小数秒) 定义时间间隔.

var_name interval year to [year_precision] month   -- year_precision 代表年的位数, 从0-4, 缺省是2

var_name intrerval day [天的位数] to second [秒的位数]

天的位数: 0 到 9 , 缺省是 2

秒的位数: 0 到 9, 缺省是 6

什么时候用 interval

当我们要处理时间数量时, 可以用 interval,

下面例子中, 如果不用 interval 也可以处理, 但是很麻烦, 因为时间的间隔计算, 需要将年, 月 等字段分别提取计算, 还涉及到进位等问题.

例如:

   1:  -- chap10_02.sql
   2:  declare
   3:      start_date TIMESTAMP;
   4:      end_date TIMESTAMP;
   5:      service_interval interval year to month;
   6:      years_of_service number;
   7:      months_of_service number;
   8:  begin
   9:      start_date := to_timestamp('29-dec-1988', 'dd-mon-yyyy');
  10:      end_date := to_timestamp('26-dec-1995', 'dd-mon-yyyy');
  11:      
  12:      -- 确定工龄, 并显示出来:
  13:      service_interval := (end_date - start_date) year to month;
  14:      dbms_output.put_line(service_interval);
  15:      
  16:      years_of_service := extract(year from service_interval);
  17:      months_of_service := extract(month from service_interval);
  18:      dbms_output.put_line(years_of_service || 'years and ' || months_of_service || 'months');
  19:  end;
  20:  /
  21:  show errors;

例子2:

讨论一个有流水生产线的企业, 组装每个产品所需要的时间(组装时间)是一个很重要的度量指标, 我们叫 ST, 缩短这个间隔会让产品线更有效率, 因此管理层希望能够跟踪并报告这个间隔, 在这个例子中, 每个产品在组装过程中都用一个跟踪号进行识别, 用来保存组装信息是这样的:

   1:  -- chap10_03.sql
   2:  table assembiles (
   3:      tracking_id number not null,
   4:      start_time timestamp not null,
   5:      build_time interval day to second
   6:  );
   7:   
   8:  function calc_bulid_time (esn IN assembiles.tracking_id%type)
   9:      return dsinterval_unconstrained
  10:  is
  11:      start_ts assembiles.start_time%type;
  12:  begin
  13:      select start_time into start_ts from assemblies
  14:       where tracking_id = esn;
  15:      return localtimestamp - start_ts;
  16:  end;
  17:  /
  18:  show errors;

日期和时间戳直接量

date ‘yyyy-mm-dd’例如: ‘2012-12-12’

timestamp ‘yyyy-mm-dd hh:mi: ss[.fffffffff] [{+ | –}hh:mi]’

例如: ‘2012-12-12 05:05:00.123456789 +08:00’

   1:  -- chap10_04.sql
   2:  -- 直接量日期, 时间戳
   3:  declare
   4:      ts1 timestamp with time zone;
   5:      ts2 timestamp with time zone;
   6:      ts3 timestamp with time zone;
   7:      ts4 timestamp with time zone;
   8:      ts5 date;
   9:  begin
  10:      -- 有两个小数部分
  11:      ts1 := timestamp '2002-02-19 11:52:00.00 -06:00';
  12:      -- 9位小数, 24小时, 
  13:      ts2 := timestamp '2002-02-19 14:00:00.000000000 -05:00';
  14:      -- 没有任何小数的秒
  15:      ts3 := timestamp '2002-02-19 13:52:00 -5:00';
  16:      -- 没有带时区, 使用缺省的会话时区
  17:      ts4 := timestamp '2002-02-19 13:52:00';
  18:      -- 一个日期直接量
  19:      ts5 := date '2002-02-19';
  20:  end;

时间和日期这一章, 内容很多, 个人感觉很多东西都用不上, 所以没有收录, 需要其他内容可以查看原书.

plsql programming 10 日期和时间戳相关推荐

  1. 字符串日期转时间戳的解决办法且时间戳[10,13]位区别

    1.日期转时间戳 或 时间戳 转 日期 const currentTime =moment(new Date()).format('YYYY-MM-DD hh:mm:ss') console.log( ...

  2. python3 时间、日期、时间戳的转换

    1.简介 在编写代码时,往往涉及时间.日期.时间戳的相互转换. 2.示例 # 引入模块 import time, datetime 2.1 str类型的日期转换为时间戳 # 字符类型的时间 tss1 ...

  3. 日期格式转换成时间戳格式php,php日期转时间戳,指定日期转换成时间戳

    有朋友问php与mysql有没有办法把日期转时间戳或把指定日期转换成时间戳呢,其实这个是有并且还非常的简单,下面我来给大家介绍介绍. 一.在MySQL中完成 这种方式在MySQL查询语句中转换,优点是 ...

  4. Python 日期和时间戳的转换

    Python 日期和时间戳的转换 1. Python中处理时间的模块 Python中处理时间的模块有time.datetime和calendar. 在Python中表示时间的方式: 时间戳:10位整数 ...

  5. PHP转换时间戳mktime,php日期转换为时间戳的方法

    PHP 日期转换为时间戳 strtotime 与 mktime 函数 日期转换为时间戳 PHP 提供了函数可以方便的将各种形式的日期转换为时间戳,该类函数主要是: strtotime():将任何英文文 ...

  6. Python3 日期与时间戳相互转换

    开发中经常会对时间格式处理,对于时间数据,比如2019-02-28 10:23:29,有时需要日期与时间戳进行相互转换,在Python3中主要用到time模块,相关的函数如下: 其中unix_time ...

  7. lua 差值 日期_lua时间戳和日期转换及踩坑

    lua时间戳和日期转换及踩坑 介绍lua的日期函数常用方法及我的一个踩坑. 时间戳转日期# Copyos.date("%Y%m%d%H",unixtime) --os.date(& ...

  8. 常见的javascript日期和时间戳互相转化

    写在前面 前两天写了一篇<常见的Javascript获取时间戳>,今天来一篇续集吧,日期和时间戳的互转 预备知识 知道什么是时间戳:即距离1970年01月01日00时00分00秒的毫秒数( ...

  9. [转载] python 中的时间,日期,时间戳互相转换

    参考链接: 日期时间的Python时间戳,反之亦然 时间戳(timestamp),一个能表示一份数据在某个特定时间之前已经存在的. 完整的. 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间. ...

最新文章

  1. 电脑上的科学计算机怎么用,电脑上怎么快速打开计算器
  2. 二叉查找树的简单实现
  3. mac PHP集成开发工具(PhpStorm)
  4. 休眠身份,序列和表(序列)生成器
  5. 再好的代码没有电也跑不了
  6. 【英语学习】【English L06】U08 News L4 A piece of great news
  7. git切换分支出现head is now at_git寻根——^和~的区别
  8. 需要在计算机上安装msxml版本 6.0,win10安装不了office 2010提示“MSXML版本6.10.1129.0”怎么办...
  9. 串口信号定义和接线方法-5针串口-9针串口-全功能串口
  10. OpenCV-单峰三角阈值法Thresh_Unimodal
  11. java pow_Java pow()方法
  12. 【记录】ChatGPT|注册流程、使用技巧与应用推荐(更新至2022年12月14日)
  13. LED亮5秒灭5秒C语言程序代码,单片机【木仓示申吧】_百度贴吧
  14. 【H.264】码流解析 annexb vs avcc
  15. 进大厂全靠自学,微软头条实习生现身说法:我是这样自学深度学习的
  16. 96道前端面试题,作出的职业规划建议
  17. 《脉脉:人才流动与迁徙2022》,遭”哄抢”的复合型程序员成IT黑马
  18. 我们的时间去了哪里?
  19. 创业篇之七:利益法则
  20. CAD怎么降低版本保存

热门文章

  1. 使iPhone手机持续振动
  2. Drainage Ditches
  3. php-fpm定义成集群资源时报错解决方法
  4. 【166期推荐】医院中电脑耗材采购该不该归信息科负责?
  5. electron 利用 electron-builder实现自动更新
  6. ios 关于block传值报错
  7. 找出和为某个数的连续正整数序列
  8. 关于autorelease pool一个较好的理解
  9. c# for 应输入;
  10. Android高级编程(笔记)-第6章 数据存储、检索和共享--2--本地文件