有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java CST/CDT时区更改问题

我们将时间存储为'22-NOV-17 05.33.51.937000000 PM'格式,服务器默认时区为CST。在许多地方,我们有一半的时间进行比较。所以CST到CDT和CDT到CST都面临问题,因为在数据库的检索时间上,我们无法识别时区。因此,它打破了我们对CST到CDT以及CDT到CST时间变化的时间比较

我们不能改变我们的存储逻辑,比如使用时区存储和UTC时区存储,因为这会破坏我们在许多地方的现有逻辑

那么,有没有办法识别日期时区,比如CST或CDT,它们存储在数据库中,格式为“2017年11月22日05.33.51.937000000 PM”


共 (1) 个答案

  1. # 1 楼答案

    We are storing time in like '22-NOV-17 05.33.51.937000000 PM' format

    你的评论没有道理

    We are storing as a timestamp in database

    在Oracle数据库中,TIMESTAMP没有格式——它在数据库中存储为11个字节,表示年(2字节)、月、日、时、分、秒(每个字节1字节)和小数秒(4字节)。只有当您使用任何接口(SQL/Plus、SQL Developer、Toad、Java、PHP等)与数据库对话时,才决定将其显示给您,即用户,该接口才会将其格式化为字符串(但数据库只将其保留为字节,而不采用任何格式)

    假设您使用的是SQL/Plus或SQL Developer,那么您可以通过以下方式找到默认格式:

    SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_TIMESTAMP_FORMAT';
    

    并使用以下命令更改默认格式:

    ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SSXFF9';
    

    或者TIMESTAMP WITH TIME ZONE

    ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SSXFF9 TZR';
    

    So is there any way to identity date timezone like CST or CDT, stored in database with '22-NOV-17 05.33.51.937000000 PM' format.

    不,如果没有任何其他元数据可以识别时间戳的来源并指出它来自哪个位置(即,是否有另一列链接到输入数据的用户,该数据可以映射到物理位置,从而映射到时区),那么就不可能确定它来自哪个时区

    您需要:

    • 将数据库列更改为TIMESTAMP WITH TIME ZONE,并存储时区;或者
    • 存储时将所有值转换为同一时区