ORACLE HANDBOOK系列之七:时间与时区(Time and Time Zone)(二)

2014-11-24 15:25:12 · 作者: · 浏览: 1
onverts 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

五)

时区的基本换算

时区分东西,东时区都带+号标识,西时区用-号。在一个特定的时间点,时区号越大(考虑正负号)的地方,时间越晚,比如北京在+08:00, St. Louis-06:00区,北京已经是傍晚了,St. Louis还在凌晨,它们之前相差即+08:00-(-06:00)=14(受夏时制的影响,可能会有一个小时的误差)。

六)

应该选择哪种时间类型?

如果需要记录的时间精度超过秒,选择timestamp类型。

如果需要将时间在数据库时区与客户端时区之间进行自动转换,选择timestamp with local time zone

如果需要记录客户插入的时区信息,选择timestamp with time zone

七)

ODP.NETOracleGlobalization

对于timestamp with time zone类型,由于包含了原始时区信息,所以应用程序中对其进行手动的转换也不困难。除了手动方法,我们还可以通过设置OracleGlobalization下的相关属性让ODP.NET为你进行自动转换。看一个例子:

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

可以看到当设置了时区,并在sql语句中使用了‘AT LOCAL’后,原来的时间被自动转换到了芝加哥的时间(芝加哥在西6区,所以与原时间的时区东5区差为11小时)。

作者 Snowtoday MSN:MyYe110w@hotmail.com