真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ORACLE時(shí)間與時(shí)區(qū)(TimeandTimeZone)

轉(zhuǎn):https://www.2cto.com/database/201110/107435.html

一)

成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信小程序開(kāi)發(fā)、集團(tuán)成都企業(yè)網(wǎng)站定制等服務(wù)項(xiàng)目。核心團(tuán)隊(duì)均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗(yàn),服務(wù)眾多知名企業(yè)客戶;涵蓋的客戶類型包括:成都宴會(huì)酒店設(shè)計(jì)等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗(yàn),同時(shí)也獲得了客戶的一致認(rèn)可!

Oracle中的四種時(shí)間類型

Date

Timestamp

Timestamp with local time zone

Timestamp with time zone

這四種類型中,前兩個(gè)與時(shí)區(qū)完全無(wú)關(guān),它們的“行為”就像varchar2或者number類型一樣,就是你插入時(shí)是什么值,那么存儲(chǔ)的也是一樣的值,同時(shí)查詢出來(lái)的也是一樣的值(包括你在.NET環(huán)境下用ADO.NET或者ODP.NET進(jìn)行查詢),不存在任何所謂的“參數(shù)”設(shè)置可以改變它們(當(dāng)然,你可以改變它們的顯示格式,但不是值)。

后兩個(gè)類型則跟時(shí)區(qū)信息緊密相關(guān),但它們之間又有較大的不同。timestamp with local time zone事實(shí)上并不存儲(chǔ)時(shí)區(qū)信息,在向此類型的列中插入值時(shí),用戶提供時(shí)區(qū)信息,但是Oracle會(huì)自動(dòng)將其轉(zhuǎn)換成dbtimezone下的時(shí)間進(jìn)行存儲(chǔ),所以,timestamp with local time zone有時(shí)區(qū)信息,即數(shù)據(jù)庫(kù)時(shí)區(qū),但它并不存儲(chǔ)時(shí)區(qū)信息。當(dāng)查詢發(fā)生時(shí),Oracle再將時(shí)間轉(zhuǎn)化到客戶端的時(shí)區(qū)(sessiontimezone)進(jìn)行顯示。

不同于timestamp with local time zone這種把時(shí)區(qū)的轉(zhuǎn)換委托給Oracle服務(wù)器,timestamp with time zone則是單純地把你在insert時(shí)提供的時(shí)間+時(shí)區(qū)信息保存到數(shù)據(jù)庫(kù)中。

二)

兩個(gè)與時(shí)區(qū)相關(guān)的參數(shù)

Dbtimezone

Sessiontimezone

--會(huì)話時(shí)區(qū)
select sessiontimezone from dual;
---數(shù)據(jù)庫(kù)時(shí)區(qū)
select systimestamp from dual;
--time with zone
select dbtimezone from dual;

前者表示數(shù)據(jù)庫(kù)時(shí)區(qū),后者表示客戶端時(shí)區(qū)。只有timestamp with local time zone才會(huì)受時(shí)區(qū)修改的影響。這兩個(gè)參數(shù)都可以通過(guò)alter命令進(jìn)行修改。

對(duì)客戶端操作系統(tǒng)時(shí)區(qū)的修改將會(huì)影響此機(jī)器上的oracle客戶端的sessiontimezone;修改服務(wù)器操作系統(tǒng)時(shí)區(qū)并不會(huì)改變dbtimezone。

SQL> select dbtimezone from dual;
DBTIMEZONE
------------------------------
-06:00


SQL> select sessiontimezone from dual;
SESSIONTIMEZONE
------------------------------
+08:00

修改客戶端或數(shù)據(jù)庫(kù)時(shí)區(qū)的alter命令:

alter session set time_zone='+10:00'; 

alter database set time_zone='+10:00'; 

 

如果數(shù)據(jù)庫(kù)中存在有timestamp with local time zone類型的 字段,則在修改dbtimezone時(shí)會(huì)出現(xiàn)ORA-30079: cannot alter database timezone when database has TIMESTAMP WITH LOCAL TIME ZONE columns

三)

如何向數(shù)據(jù)庫(kù)插入一個(gè)timestamp with time zone或者timestamp with local time zone類型

SQL> create table tz1(twtz timestamp with time zone, twltz timestamp with local time zone);

SQL> insert into tz1 values(timestamp'2011-01-03 15:00:00.000000 +05:00',timestamp'2011-01-03 15:00:00.000000 +05:00');

SQL> select sessiontimezone from dual;
SESSIONTIMEZONE
---------------------------------------------------------------------------
+08:00

SQL> select * from tz1;
TWTZ                                    TWLTZ
---------------------------------------------------------------------------
03-JAN-11 03.00.00.000000 PM +05:00     03-JAN-11 06.00.00.000000 PM

SQL> alter session set time_zone='-06:00';

SQL> select * from tz1;
TWTZ                                    TWLTZ
---------------------------------------------------------------------------
03-JAN-11 03.00.00.000000 PM +05:00     03-JAN-11 04.00.00.000000 AM

除了采用類似“+05:00”這種形式的時(shí)區(qū)標(biāo)識(shí)外,還可以使用時(shí)區(qū)的縮寫,比如GMT,PST等等(可以查看系統(tǒng)視圖 V$TIMEZONE_NAMES)。如果在insert時(shí)未給出時(shí)區(qū)信息,那么默認(rèn)為當(dāng)前客戶端的時(shí)區(qū)。

四)

一些與時(shí)區(qū)相關(guān)的函數(shù):

函數(shù)

返回值

返回值類型

SYSTIMESTAMP

Current date/time, in Database TZ

TIMESTAMP WITH TIME ZONE

CURRENT_TIMESTAMP

Current date/time, in Client Session TZ

TIMESTAMP WITH TIME ZONE

LOCALTIMESTAMP

Local date/time in Client Session, but with no TZ info

TIMESTAMP

DBTIMEZONE

Database time zone, in HH:MI offset from GMT

VARCHAR2

SESSIONTIMEZONE

Session time zone, in HH:MI offset from GMT

VARCHAR2

EXTRACT (part FROM date_time)

Extracts year, hour, seconds, time zone name, etc. from a supplied datetime or interval expression.

VARCHAR2

SYS_EXTRACT_UTC(date_time with TZ)

GMT (UTC) time of date/time supplied

TIMESTAMP

TZ_OFFSET(TZ)

Returns hour/minute offset from GMT of TZ

VARCHAR2

FROM_TZ(timestamp,TZ)

Converts a TIMESTAMP to TIMESTAMP WITH TIME ZONE

TIMESTAMP WITH TIME ZONE

TO_TIMESTAMP

Convert char + fmt model to TIMESTAMP

TIMESTAMP

TO_TIMESTAMP_TZ

Convert char + fmt model to TIMESTAMP WITH TIME ZONE

TIMESTAMP WITH TIME ZONE

五)

時(shí)區(qū)的基本換算

時(shí)區(qū)分東西,東時(shí)區(qū)都帶+號(hào)標(biāo)識(shí),西時(shí)區(qū)用-號(hào)。在一個(gè)特定的時(shí)間點(diǎn),時(shí)區(qū)號(hào)越大(考慮正負(fù)號(hào))的地方,時(shí)間越晚,比如北京在+08:00區(qū), St. Louis在-06:00區(qū),北京已經(jīng)是傍晚了,St. Louis還在凌晨,它們之前相差即+08:00-(-06:00)=14(受夏時(shí)制的影響,可能會(huì)有一個(gè)小時(shí)的誤差)。

六)

應(yīng)該選擇哪種時(shí)間類型?

如果需要記錄的時(shí)間精度超過(guò)秒,選擇timestamp類型。

如果需要將時(shí)間在數(shù)據(jù)庫(kù)時(shí)區(qū)與客戶端時(shí)區(qū)之間進(jìn)行自動(dòng)轉(zhuǎn)換,選擇timestamp with local time zone。

如果需要記錄客戶插入的時(shí)區(qū)信息,選擇timestamp with time zone。

七)

ODP.NET與OracleGlobalization

對(duì)于timestamp with time zone類型,由于包含了原始時(shí)區(qū)信息,所以應(yīng)用程序中對(duì)其進(jìn)行手動(dòng)的轉(zhuǎn)換也不困難。除了手動(dòng)方法,我們還可以通過(guò)設(shè)置OracleGlobalization下的相關(guān)屬性讓ODP.NET為你進(jìn)行自動(dòng)轉(zhuǎn)換??匆粋€(gè)例子:

conn.Open();//connection should be opened before SetSessionInfo() could be invoked.
//
OracleGlobalization og = OracleGlobalization.GetClientInfo();
og.TimeZone = "America/Chicago";
OracleGlobalization.SetThreadInfo(og);
conn.SetSessionInfo(og);
//
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "select twtz from tz1";
OracleDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
    while (dr.Read())
    {
        OracleTimeStampTZ otstz = dr.GetOracleTimeStampTZ(dr.GetOrdinal("twtz"));
        Console.WriteLine("twtz: " + otstz.ToString());
    }
}
dr.Close();
//
//an alias is necessary when using 'AT LOCAL' predicate
cmd.CommandText = "select twtz AT LOCAL as twtz from tz1";
dr = cmd.ExecuteReader();
if (dr.HasRows)
{
    while (dr.Read())
    {
        OracleTimeStampTZ otstz = dr.GetOracleTimeStampTZ(dr.GetOrdinal("twtz"));
        Console.WriteLine("twtz AT LOCAL: " + otstz.ToString());
    }
}
dr.Close();
 

//output:
twtz:                   03-JAN-11 03.00.00.000000 PM +05:00

twtz AT LOCAL:                        03-JAN-11 04.00.00.000000 AM AMERICA/CHICAGO

可以看到當(dāng)設(shè)置了時(shí)區(qū),并在sql語(yǔ)句中使用了‘AT LOCAL’后,原來(lái)的時(shí)間被自動(dòng)轉(zhuǎn)換到了芝加哥的時(shí)間(芝加哥在西6區(qū),所以與原時(shí)間的時(shí)區(qū)東5區(qū)差為11小時(shí))。


網(wǎng)站題目:ORACLE時(shí)間與時(shí)區(qū)(TimeandTimeZone)
標(biāo)題來(lái)源:http://weahome.cn/article/jsiccd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部