我有一个数据库(Oracle数据库11g企业版11.2.0.4.0版-64位生产)。在其中有一个表(Course),其中有一个“日期”列(start_dte)。我想将输出格式化为char,所以我使用了:
SELECT start_dte,
to_Char(start_dte) AS start_dte_2,
to_Char(start_dte,'DD.MM.YYYY') AS start_dte_3,
to_Char(start_dte,'DD.MM.YYYY HH24:MI:SS') AS start_dte_4,
to_Char(start_dte,'DD.MM.YYYY HH12:MI:SS') AS start_dte_5,
to_Char(start_dte,'DD.MM.YYYY HH.MI.SSXFF AM') AS start_dte_6,
to_Char(start_dte,'DD.MM.YYYY HH24:MI:SSxFF') AS start_dte_7,
to_Char(start_dte,'DD-MON-YYYY HH24:MI:SSxFF TZH:TZM') AS start_dte_8
FROM Course
结果:
数字6,7,8给我
java.sql.SQLException:ORA-01821:日期格式无法识别
6与以下格式相同:
SELECT value
FROM V$NLS_PARAMETERS
WHERE parameter = 'NLS_TIME_FORMAT'
7和8取自Oracle文档,但这仅用于时间戳记。那我想念的是什么?我知道实际的数据类型应该是日期时间,但是我对该数据库只有读权限。我实际上想要的是:
甚至更好:
答案 0 :(得分:2)
DATE
没有任何时区信息,因此,如果要调整显示的时间,则需要指定该日期名义上代表的时区,以及要转换的时区来。
例如,如果您存储的日期表示UTC,并且您想查看巴黎的等效本地时间,则可以通过将其转换为普通时间戳并将其传递到the from_tz()
function中来声明存储时间为UTC。 ;然后specify the target timezone with at
:
-- CTE for your sample data
with course (start_dte) as (
select cast(timestamp '2018-10-17 14:00:00' as date) from dual
)
-- actual query
select from_tz(cast(start_dte as timestamp), 'UTC')
at time zone 'Europe/Paris' as start_timestamp_tz
from course;
START_TIMESTAMP_TZ
------------------------------------------
2018-10-17 16:00:00.000000000 EUROPE/PARIS
由于要通过JDBC查询,因此您可能希望将其作为本机数据类型检索,然后选择如何在本地显示它。 (但您大概可以将其查询为日期,也可以在Java中对其进行调整...)
但是,如果要在数据库端将其转换为字符串,只需使用已经使用的格式模型:
select to_char(from_tz(cast(start_dte as timestamp), 'UTC')
at time zone 'Europe/Paris', 'DD.MM.YYYY HH24:MI') as start_date
from course;
START_DATE
----------------
17.10.2018 16:00
将其分为两个字段也很简单,如果您不想重复进行转换,则可以使用CTE或嵌入式视图:
select to_char(start_timestamp_tz, 'DD.MM.YYYY') as start_date,
to_char(start_timestamp_tz, 'HH24:MI') as start_time
from (
select from_tz(cast(start_dte as timestamp), 'UTC')
at time zone 'Europe/Paris' as start_timestamp_tz
from course
);
START_DATE START_TIME
---------- ----------
17.10.2018 16:00
但是听起来Java应该将其转换为显示字符串。
答案 1 :(得分:1)
我实际上想要什么:
| START_DATE | |------------------| | 17.10.2018 16:00 |
甚至更好:
| START_DATE | START_TIME | |------------|------------| | 17.10.2018 | 16:00 |
使用:
SELECT to_Char(start_dte,'DD.MM.YYYY') AS start_date,
to_Char(start_dte,'HH24:MI') AS start_time
FROM Course
如果您的数据存储在一个时区(即UTC)中的表中,而您想要在另一个时区中使用它,则使用:
CAST( date_value AS TIMESTAMP )
,将其从DATE
数据类型转换为TIMESTAMP
数据类型。FROM_TZ( timestamp_value, timezone_string )
将其在给定时区从TIMESTAMP
数据类型转换为TIMESTAMP WITH TIME ZONE
数据类型。timestamp_with_timezone_value AT TIME ZONE timezone_string
将其从一个时区转换为另一个时区。赞:
SELECT TO_CHAR(
FROM_TZ( CAST( start_dte AS TIMESTAMP ), 'UTC' ) AT TIME ZONE 'Europe/Berlin',
'DD.MM.YYYY'
) AS start_date,
TO_CHAR(
FROM_TZ( CAST( start_dte AS TIMESTAMP ), 'UTC' ) AT TIME ZONE 'Europe/Berlin',
'HH24:MI'
) AS start_time
FROM Course
答案 2 :(得分:0)
start_dte
是一个DATE
值。
DATE
既没有小数秒(即XFF
)也没有时区信息(即TZH:TZM
)
使用TIMESTAMP WITH TIME ZONE
是您想要得到这样的输出。