[英]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_dte
是DATE
值。
DATE
既沒有小數秒(即XFF
),也沒有時區信息(即TZH:TZM
)
您想使用TIMESTAMP WITH TIME ZONE
來獲得這樣的輸出嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.