Как изящно закрыть другое приложение?

У меня есть приложение для установки на основе C ++ / CLI, которое должно закрыть другое написанное мной приложение, заменить .exe и dll приложения и повторно запустить исполняемый файл.

Прежде всего мне нужно закрыть это окно по следующим строкам:

HWND hwnd = FindWindow(NULL, windowTitle);
if( hwnd != NULL )
{
    ::SendMessage(hwnd, (int)0x????, 0, NULL);
}

Т.е. (xs: dateTime, как определено в XML) до даты Oracle. Я привык использовать это в PL / SQL: to_date ('date here', 'yyyymmdd'), есть ли ...

Мне нужно преобразовать дату из этого формата:

2002-10-10T12 : 00: 00-05: 00 (xs: dateTime, как определено в XML) от

до даты Oracle .

Я привык использовать это в PL / SQL: to_date ('date here', 'yyyymmdd'), Есть ли способ преобразовать это, сохраняя информацию о часовом поясе?

Спасибо

6
задан Dimitre Novatchev 23 August 2010 в 17:14
поделиться

2 ответа

В датах Oracle нет информации о часовом поясе. Вместо этого вам нужно будет использовать тип данных TIMESTAMP.

Это работает примерно так:

SQL> desc tz
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 TS                                                 TIMESTAMP(6) WITH TIME ZONE
 TNOW                                               TIMESTAMP(6) WITH TIME ZONE

SQL> insert into tz
  2  values (1
  3          , to_timestamp_tz('2002-10-10 12:00:00-05:00'
  4                           , 'YYYY-MM-DD HH24:MI:SSTZH:TZM')
  5          , systimestamp)
  6  /

1 row created.

SQL> select * from tz
  2  /

        ID
----------
TS
---------------------------------------------------------------------------
TNOW
---------------------------------------------------------------------------
         1
10-OCT-02 12.00.00.000000 -05:00
23-AUG-10 17.37.06.502000 +01:00


SQL>

Обратите внимание, что есть сложная проблема с T в нотации XSD. Это вызывает исключение ORA-01858 , потому что это недопустимый формат в Oracle. Я уверен, что есть обходной путь, но в настоящее время он ускользает от меня.


Что ж, одно временное решение - применить функцию SUBSTR (), чтобы разделить две части метки времени, как показывает Боб. Но должен быть способ более элегантный.


Это, вероятно, не квалифицируется как «элегантный», но поскольку это строка, мы можем использовать функцию подстановки, чтобы избавиться от надоедливого T:

SQL> insert into tz
  2  values (2
  3          , to_timestamp_tz(translate('2003-10-10T12:00:00-05:00', 'T', ' ')
  4                   , 'YYYY-MM-DD HH24:MI:SSTZH:TZM')
  5          , systimestamp)
  6  /

1 row created.

SQL> select * from tz
  2  /

        ID
----------
TS
---------------------------------------------------------------------------
TNOW
---------------------------------------------------------------------------
         1
10-OCT-02 12.00.00.000000 -05:00
23-AUG-10 17.37.06.502000 +01:00

         2
10-OCT-03 12.00.00.000000 -05:00
23-AUG-10 17.53.37.113000 +01:00


SQL>

Но, учитывая все усилия, которые Oracle вложил в XMLDB, довольно неприятно, что нет более аккуратного решения.


"Я не понимаю, как у вас -05: 00. "

В моем исходном примере я использую маску формата 'YYYY-MM-DD HH24: MI: SS-TZH: TZM' . Это интерпретирует - в часовом поясе в качестве разделителя , а не как минус, поэтому вернул +05: 00.С тех пор я исправил свой образец кода, чтобы удалить последнее тире. Теперь часовой пояс правильно отображается как -05: 00. Извините за путаницу.

7
ответ дан 8 December 2019 в 12:57
поделиться

Вот пример того, как преобразовать это в типы данных DATE и TIMESTAMP WITH TIME ZONE. Обратите внимание, что при использовании типа DATE информация о часовом поясе теряется (при преобразовании из TIMESTAMP WITH TIME ZONE):

declare 
  strDate     VARCHAR2(32767);
  tzDate      TIMESTAMP WITH TIME ZONE;
  dtDate      DATE;
  nTimezone   NUMBER;
  dtDate_GMT  DATE;
begin
  strDate := '2002-10-10T12:00:00-05:00';

  dtDate := TO_TIMESTAMP_TZ(SUBSTR(strDate, 1, 10) ||
                            SUBSTR(strDate, 12, 8) || ' ' ||
                            SUBSTR(strDate, 20, 6), 'YYYY-MM-DDHH:MI:SS TZH:TZM');
  tzDate := TO_TIMESTAMP_TZ(SUBSTR(strDate, 1, 10) ||
                            SUBSTR(strDate, 12, 8) || ' ' ||
                            SUBSTR(strDate, 20, 6), 'YYYY-MM-DDHH:MI:SS TZH:TZM');
  nTimezone := TO_NUMBER(SUBSTR(strDate, 20, 3)) +
                 (TO_NUMBER(SUBSTR(strDate, 24, 2)) / 60);
  dtDate_GMT := dtDate - ((INTERVAL '1' HOUR) * nTimezone);

  dbms_output.put_Line('dtDate=' || dtDate);
  dbms_output.put_Line('dtDate=' || TO_CHAR(dtDate, 'YYYY-MM-DD HH24:MI:SS'));
  dbms_output.put_line('tzDate=' || tzDate);
  dbms_output.put_line('tzDate=' || TO_CHAR(tzDate, 'YYYY-MM-DD HH24:MI:SS TZH:TZM'));
  dbms_output.put_line('nTimezone=' || nTimezone);
  dbms_output.put_Line('dtDate_GMT=' || TO_CHAR(dtDate_GMT, 'YYYY-MM-DD HH24:MI:SS'));
end;

Просто ради интереса я добавил в пример немного кода, чтобы извлечь часовой пояс из строки, а затем добавил часовой пояс к местному времени, чтобы получить GMT/UTC.

Поделитесь и наслаждайтесь.

2
ответ дан 8 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: