[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/ ,如需转载,请注明出处,否则将追究法律责任。