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.NET与OracleGlobalization
对于timestamp with time zone类型,由于包含了原始时区信息,所以应用程序中对其进行手动的转换也不困难。除了手动方法,我们还可以通过设置OracleGlobalization下的相关属性让ODP.NET为你进行自动转换。看一个例子:
//
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
可以看到当设置了时区,并在sql语句中使用了‘AT LOCAL’后,原来的时间被自动转换到了芝加哥的时间(芝加哥在西6区,所以与原时间的时区东5区差为11小时)。
作者 Snowtoday MSN:MyYe110w@hotmail.com