簡體   English   中英

to_Char(DATE)與時間

[英]to_Char(DATE) with 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

結果:

在此處輸入圖片說明

6,7,8給我

java.sql.SQLException:ORA-01821:日期格式無法識別

6具有與以下相同的格式:

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

在此處輸入圖片說明

7和8取自Oracle文檔,但這僅用於時間戳記。 那我想念什么呢? 我知道實際的數據類型應該是日期時間,但是我對該數據庫只有讀權限。 我實際上想要的是:

在此處輸入圖片說明

甚至更好:

在此處輸入圖片說明

DATE沒有任何時區信息,因此,如果要調整顯示的時間,則需要指定該日期名義上表示的時區以及要將其轉換為的時區。

例如,如果您存儲的日期表示UTC,並且您想查看巴黎的等效本地時間,則可以通過將其轉換為普通時間戳並將其傳遞from_tz()函數來聲明存儲的時間為UTC。 然后指定與目標時區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應該將其轉換為顯示字符串。

我實際上想要的是:

 | 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

start_dteDATE值。

DATE既沒有小數秒(即XFF ),也沒有時區信息(即TZH:TZM

您想使用TIMESTAMP WITH TIME ZONE來獲得這樣的輸出嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM