У нас есть задание на C #, которое запрашивает базу данных Oracle (версия 12.1.0.2) для объекта OdbcDataAdapter, например:
using (OdbcConnection OdbcConn = source.GetOdbcConnection())
{
OdbcCommand cmd = new OdbcCommand(query, OdbcConn);
cmd.CommandTimeout = 0;
using (OdbcDataAdapter dAdapter = new OdbcDataAdapter(cmd))
{
dAdapter.Fill(fileLoaded);
}
}
Запрос содержит это в select:
, TO_CHAR (DEL_DTTM, 'ГГГГ-ММ-ДД ЧЧ24: MI: SS') "Время доставки2"
Когда выполняется приведенный выше код, возвращается '2018-10-21 02:24:00'.Однако, когда тот же запрос выполняется в SQL Developer (редактор запросов Oracle), мы получаем «2018-10-21 03:24:00».
(Добавление дополнительных сведений) Этот столбец фактически является «ДАТА 'тип.И выясните, это на самом деле хранится как '2018-10-21 07:24:00' и управляется через представление с помощью этой функции:
, to_char (CAST ((FROM_TZ (CAST)(OB_DEL_BIRTH_DTTM как TIMESTAMP), 'GMT') В СЕССИИ ЗОНА ВРЕМЕНИ) КАК ДАТА), 'YYYY-MM-DD HH24: MI: SS') как DEL_DTTM
Я в часовом поясе Америка / Нью-Йорк,поэтому я думаю, что это преобразование применяет «текущую дату» к локализации из соединения ODBC, но «сегодня» - это GMT -5: 00, тогда как сравниваемая дата - во время перехода на летнее время, поэтому должно быть -4:00.
(Подробнее) Поэтому, когда я запускаю «select sessiontimezone from dual» в SQL Developer, я получаю «America / New_York», но затем через C # / ODBC я получаю -5: 00.Если я запускаю 'выберите TZ_OFFSET (sessiontimezone) из dual' через оба, я получаю -5: 00.
Есть идеи, друзья?