ITPub博客

首页 > Linux操作系统 > Linux操作系统 > [20230714]计算从1970.1.1的秒数相关脚本.txt

[20230714]计算从1970.1.1的秒数相关脚本.txt

原创 Linux操作系统 作者:lfree 时间:2023-07-23 20:29:36 0 删除 编辑

[20230714]计算从1970.1.1的秒数相关脚本.txt

--//以前写过一个知道微秒计算日期的xdate命令,是bash shell的脚本.自己完善着方面的脚本:

# cat /usr/local/bin/xdate
#! /bin/bash
# date -d "1970-01-01 00:00:00  UTC  $( echo "scale=6; $1/1000000"  |bc -l) seconds" +"%Y-%m-%d %T.%N"
date -d "@$( echo "scale=6; $1/1000000"  |bc -l)" +"%Y-%m-%d %T.%N"

--//我感觉许多情况单位是秒.改写如下:

# cat /usr/local/bin/xdate
#! /bin/bash
# date -d "1970-01-01 00:00:00  UTC  $( echo "scale=6; $1"  |bc -l) seconds" +"%Y-%m-%d %T.%N"
date -d "@$( echo "scale=6; $1"  |bc -l)" +"%Y-%m-%d %T.%N"

--//如果输入微秒.可以输入 ,注意第2种格式要求比较新的linux版本才支持这样写法.

$ xdate 1587092504567446/1000000
2020-04-17 11:01:44.567446000
2020-04-17 11:01:44.567446000

--//反向呢?比如知道日期,如何转换为从1970/01/01的秒数呢?重新完善xdate bash shell脚本.
--//手工测试如下:
$ date -d "2020-04-17 11:01:44  0 seconds" +"%s"
1587092504

$ date -d "2020-04-17 11:01:44" +"%s"
1587092504

--//最终修改如下:
#! /bin/bash
case $2 in
  1)
     # date -d "1970-01-01 00:00:00  UTC  $( echo "scale=6; $1"  |bc -l) seconds" +"%Y-%m-%d %T.%N"
     date -d "@$( echo "scale=6; $1"  |bc -l)" +"%Y-%m-%d %T.%N"
     ;;

  2)
     date -d "$1" +"%s.%N"
     ;;

  3)
     date  +"%s.%N"
     ;;
  *)
      echo "1 --  input seconds since 00:00:00, Jan 1, 1970 (a GNU extension)"
      echo "2 --  input date format yyyy-mm-dd hh23:mi:ss using double quotation marks"
      echo "3 --  input null = current date"
     ;;
esac

--//简单测试看看:
$ ./xdate '' 3
1689341568.159810500

$ ./xdate 1689341568.159810500 1
2023-07-14 21:32:48.159810500

$ ./xdate 1689341568159810/1000000 1
2023-07-14 21:32:48.159810000

$ ./xdate "2023-07-14 21:32:48.159810000" 2
1689341568.159810000

$ ./xdate "2023-07-14 21:32:48" 2
1689341568.000000000

$ ./xdate
1 --  input seconds since 00:00:00, Jan 1, 1970 (a GNU extension)
2 --  input date format yyyy-mm-dd hh23:mi:ss using double quotation marks
3 --  input null = current date

--//如果使用sqlplus呢?我看了以前写的脚本,似乎忘记考虑时区问题,感觉这类转换比较复杂,使用sys_extract_utc函数可以转换到UTC
--//时间.改写如下:
--//我的脚本丢失秒后面的信息.因为如果采用timestamp类型相减,得到的信息无法做算术运算.

SYS@test> select (sys_extract_utc(systimestamp)  - timestamp'1970-01-01 00:00:00')  from dual ;
(SYS_EXTRACT_UTC(SYSTIMESTAMP)-TIMESTAMP'1970-01-0100:00:00')
---------------------------------------------------------------------------
+000019559 13:26:44.339000000

SYS@test> select (cast(sys_extract_utc(systimestamp) as date) - date'1970-01-01')  from dual ;
(CAST(SYS_EXTRACT_UTC(SYSTIMESTAMP)ASDATE)-DATE'1970-01-01')
------------------------------------------------------------
                                                  19559.5606


$ cat xdate.sql
set verify on
column v0 noprint
column v1 new_value _tpt_v1
column v2 new_value _tpt_v2
column v3 new_value _tpt_v3
column d20 format a30
column z20 format 9999999999
column z21 format 9999999999

set term off
select decode(&2,1, '', '--') v1 ,decode(&2,2,'','--') v2,decode(&2,3,'','--') v3 from dual;
set term on

select
1 v0
&&_tpt_v1 ,sys_extract_utc(to_timestamp('1970/1/1 00:00:00','yyyy-mm-dd hh24:mi:ss')) +  NUMTODSINTERVAL(&1,'SECOND') d20
&&_tpt_v2 ,(cast(sys_extract_utc(to_timestamp('&1','yyyy-mm-dd hh24:mi:ss.ff')) as date) - date'1970-01-01')*24*3600 z20
&&_tpt_v3 ,(cast(sys_extract_utc(systimestamp) as date) - date'1970-01-01')*24*3600 z21
from dual ;

--//测试看看:
SYS@test> @ xdate.sql '' 3
        Z21
-----------
 1689945561

SYS@test> @ xdate.sql 1689945561 1
D30
-------------------
2023-07-21 05:19:21

SYS@test> @ xdate.sql 1689945561.100100 1
D30
-----------------------------
2023-07-21 05:19:21.100100000

SYS@test> @ xdate.sql "2023-07-21 05:19:21" 2
        Z20
-----------
 1689887961

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

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

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969431