我想从oracle的日期字段获取毫秒的日期" 01-01-9999"。
我创建了下面的块来实现同样的目标。
set serveroutput on;
declare
base_point constant timestamp := to_timestamp_tz('01-JAN-1970 00:00:00.000+00:00', 'DD-Mon-RR HH24:MI:SS.FFTZH:TZM') AT TIME ZONE 'UTC';
now timestamp := to_timestamp_tz('01-01-2099 00:00:00.000+00:00', 'DD-MM-RR HH24:MI:SS.FFTZH:TZM') AT TIME ZONE 'UTC';
-- now constant timestamp := systimestamp AT TIME ZONE 'UTC' ;
n number;
begin
select to_timestamp_tz(to_char(todate,'DD-MM-YY HH24:MI:SS')||'.000+00:00','DD-MM-YY HH24:MI:SS.FFTZH:TZM')
into now
from t_table where ACCOUNTID = 'ACC001124211';
DBMS_OUTPUT.put_line(' now :'||now);
n := (
((extract(day from (now-base_point)))*86400)
+ ((extract(hour from (now-base_point)))*3600)
+ ((extract(minute from (now-base_point)))*60)
+ ((extract(second from (now-base_point))))
) * 1000;
DBMS_OUTPUT.put_line(' n :'||n);
end;
/
但是使用上面的块我得到4070908800000
的值,它等于日期1/1/2099
但我的表中的实际日期是01-01-9999
你能帮助我们使用日期字段获得精确的毫秒
答案 0 :(得分:2)
不需要 PL / SQL ,您可以在纯 SQL 中完成。
从01-JAN-1970
开始将日期转换为毫秒:
SQL> SELECT to_number(DATE '9999-01-01'
2 - to_date('01-JAN-1970','DD-MON-YYYY')) * (24 * 60 * 60 * 1000) milliseconds
3 FROM dual;
MILLISECONDS
------------------
253370764800000
SQL>
答案 1 :(得分:1)
这个陈述是你得错的原因。
select to_timestamp_tz(to_char(todate,'DD-MM-YY HH24:MI:SS')||'.000+00:00','DD-MM-YY HH24:MI:SS.FFTZH:TZM')
由于年份的格式元素为YY,因此to_char转换年份只有2位数。
select to_char(date'9999-01-01','DD-MM-YY HH24:MI:SS')||'.000+00:00' char_date
from dual
char_date
------------
01-01-99 00:00:00.000+00:00
当您使用YY作为格式元素将其转换为时间戳时,返回的年份始终与当前年份的前2位数字相同,这就是为什么您将获得2099作为年份。
select to_char(to_timestamp_tz(to_char(date'9999-01-01','DD-MM-YY HH24:MI:SS')||'.000+00:00','DD-MM-YY HH24:MI:SS.FFTZH:TZM'),'yyyy') char_date
from dual;
char_date
------------
2099
故事的道德:
由于以下原因,Oracle建议您使用4位年份元素(YYYY)而不是较短的年份元素:
答案 2 :(得分:1)
我已经发布了here一些将时间戳转换为纳秒和将纳秒转换为时间戳的方法。这些方法不受时区的影响,并且具有纳秒级的精度。
您只需将其调整为毫秒而不是纳秒。 您需要使用“ CAST(DATE_HERE AS TIMESTAMP)”将日期转换为时间戳。
SELECT (EXTRACT(DAY FROM (
CAST(SYSDATE AS TIMESTAMP) --Replace line with desired timestamp --Maximum value: TIMESTAMP '3871-04-29 10:39:59.999999999 UTC'
- TIMESTAMP '1970-01-01 00:00:00 UTC') * 24 * 60) * 60 + EXTRACT(SECOND FROM
CAST(SYSDATE AS TIMESTAMP) --Replace line with desired timestamp
)) * 1000 AS MILLIS FROM DUAL;
MILLIS
1598447857000
答案 3 :(得分:0)
我的解决方案是双向的::
至今毫厘
True
日期到毫秒(类似于java中的date.getTime())
new_matrix = set()
for x in range(len(m)):
for y in range(x+1, len(m)):
if not set(m[x]).isdisjoint(m[y]):
intersection = set(m[x]) & set(m[y])
union = set(m[x]) | set(m[y])
union.remove(*intersection)
new_matrix.add(tuple(sorted(union)))
else:
new_matrix.add(tuple(sorted(m[x])))
new_matrix.add(tuple(sorted(m[y])))
new_a = [x for x in a.split() if x in itertools.chain(*m)] # remove the strings that are not present in the matrix
new_b = [x for x in b.split() if x in itertools.chain(*m)]
print(all(tuple(sorted(x)) in new_matrix for x in zip(new_a, new_b)))