to_Char(DATE)与时间

时间:2018-09-12 13:34:48

标签: sql oracle date time

我有一个数据库(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

结果:

enter image description here

数字6,7,8给我

  

java.sql.SQLException:ORA-01821:日期格式无法识别

6与以下格式相同:

SELECT value
  FROM V$NLS_PARAMETERS
 WHERE parameter = 'NLS_TIME_FORMAT' 

enter image description here

7和8取自Oracle文档,但这仅用于时间戳记。那我想念的是什么?我知道实际的数据类型应该是日期时间,但是我对该数据库只有读权限。我实际上想要的是:

enter image description here

甚至更好:

enter image description here

3 个答案:

答案 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是您想要得到这样的输出。