AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.08.2011, 09:22   #1  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
UtcDateTime
Как так может получиться?

X++:
    transDateTime transDateTime =  DateTimeUtil::newDateTime(systemdateget(), timenow(),DateTimeUtil::getUserPreferredTimeZone()) ;

    utcdatetime             startDateTime = datetobeginUtcDateTime(systemdateget());
    utcdatetime             endDateTime = datetoendUtcDateTime(systemdateget());
    ;


    info(strfmt("%1 | %2 | %3", startDateTime, transDateTime , endDateTime));
Цитата:
03.08.2011 20:00:00 | 04.08.2011 07:22:03 | 04.08.2011 19:59:59
И это выдается на московском сервере...
Старый 04.08.2011, 09:41   #2  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Подскажите, пожалуйста, если есть поле с типом UtcDateTime, то как отфильровать записи за какой-то определенный день?
datetobeginUtcDateTime и datetoendUtcDateTime выдают какую-то фигню...
Старый 04.08.2011, 09:41   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
strfmt() выводит время UTC - без учета часового пояса

Для целей ВЫВОДА информации в нужной часовой зоне можно воспользоваться DateTimeUtil::applyTimeZoneOffset()

Про различие в использовании newDateTime() и applyTimeZoneOffset() можно посмотреть здесь Как задать литерал для DateTime с учетом TimeZone?
__________________
Axapta v.3.0 sp5 kr2
Старый 04.08.2011, 09:46   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Подскажите, пожалуйста, если есть поле с типом UtcDateTime, то как отфильровать записи за какой-то определенный день?
datetobeginUtcDateTime и datetoendUtcDateTime выдают какую-то фигню...
А отфильтровывать где?
На форме в QueryRun или в запросе select?
И по какому полю? Созданному вами или по системному (типа CreatedDateTime)?

Вообще, фильтрация учитывает временную зону.

Еще, в RU7 datetobeginUtcDateTime и datetoendUtcDateTime трубуют в качестве параметра передачи временной зоны. Возможно, в вашей версии там подставляется какое-то значение по умолчанию
__________________
Axapta v.3.0 sp5 kr2
Старый 04.08.2011, 11:24   #5  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Сообщение от AndyD Посмотреть сообщение
А отфильтровывать где?
На форме в QueryRun или в запросе select?
И по какому полю? Созданному вами или по системному (типа CreatedDateTime)?

Вообще, фильтрация учитывает временную зону.

Еще, в RU7 datetobeginUtcDateTime и datetoendUtcDateTime трубуют в качестве параметра передачи временной зоны. Возможно, в вашей версии там подставляется какое-то значение по умолчанию
Созданному мной, в обычном select.

Просто, мне всего лишь нужно вытащить из таблицы записи начиная с Дата_00:00:00 по Дата_23:23:59. Ведь тут по сути не имеет значения настройки временной зоны?

Последний раз редактировалось Eldar9x; 04.08.2011 в 11:28.
Старый 04.08.2011, 11:34   #6  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Вобщем, нужен аналог следующей конструкции:

X++:
    while select tmpShtrihMTable
        order by TransDateTime
    {
        if (DateTimeUtil::date(tmpShtrihMTable.TransDateTime) != _transDate) // _transDate нужная дата
            continue;
Старый 04.08.2011, 12:04   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
В RU7 срабатывает так
X++:
while select tmpShtrihMTable
        where tmpShtrihMTable.TransDateTime != datetobeginUtcDateTime(_transDate, DateTimeUtil::getUserPreferredTimeZone())
        order by TransDateTime
    {
Возможен еще такой вариант
X++:
while select tmpShtrihMTable
        where tmpShtrihMTable.TransDateTime != DateTimeUtil::newDateTime(_transDate, 0, DateTimeUtil::getUserPreferredTimeZone())
        order by TransDateTime
    {
        info(strfmt("%1", DateTimeUtil::applyTimeZoneOffset( tmpShtrihMTable.TransDateTime, DateTimeUtil::getUserPreferredTimeZone())));
Но это то, что делается внутри datetobeginUtcDateTime()
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Eldar9x (3).
Старый 04.08.2011, 19:33   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от AndyD Посмотреть сообщение
В RU7 срабатывает так
X++:
while select tmpShtrihMTable
        where tmpShtrihMTable.TransDateTime != datetobeginUtcDateTime(_transDate, DateTimeUtil::getUserPreferredTimeZone())
        order by TransDateTime
    {
По-моему, это неверно. Эти два выражения отнюдь не тождественны:
X++:
DateTimeUtil::date(tmpShtrihMTable.TransDateTime) != _transDate
и
X++:
tmpShtrihMTable.TransDateTime != datetobeginUtcDateTime(_transDate, DateTimeUtil::getUserPreferredTimeZone())
Первое выражение будет ложно для интервала в сутки, второе - для интервала в одну секунду.
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Вобщем, нужен аналог следующей конструкции:

X++:
    while select tmpShtrihMTable
        order by TransDateTime
    {
        if (DateTimeUtil::date(tmpShtrihMTable.TransDateTime) != _transDate) // _transDate нужная дата
            continue;
В поля типа UtcDateTime пишется дата-время по Гринвичу; по Гринвичу 2 ночи и 10 вечера одного дня - это одна и та же дата, в то время как, скажем, для Москвы эти же временные отметки будут относиться к разным датам, поэтому нужно определиться с тем, в какой временной зоне будет считаться TransDate. После того, как это станет ясно, можно будет фильтровать данные примерно так:
X++:
Timezone tz = // ...
while select tmpShtrihMTable
    where   tmpShtrihMTable.TransDateTime >= datetobeginUtcDateTime(_transDate, tz)
        &&  tmpShtrihMTable.TransDateTime <= datetoendUtcDateTime(_transDate, tz)
Старый 04.08.2011, 20:58   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Эти два выражения отнюдь не тождественны:
X++:
DateTimeUtil::date(tmpShtrihMTable.TransDateTime) != _transDate
и
X++:
tmpShtrihMTable.TransDateTime != datetobeginUtcDateTime(_transDate, DateTimeUtil::getUserPreferredTimeZone())
Да, точно, был невнимателен
__________________
Axapta v.3.0 sp5 kr2
Старый 11.10.2011, 15:25   #10  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Возникла такая проблема при считывании поля записи типа TransDateTime с последующим присвоением переменной типа TransDateTime происходит автоматическое преобразование в utc, есть ли какая то функция обратного преобразования или только сложением\вычитанием?
Старый 11.10.2011, 18:28   #11  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Ничего такого не происходит на самом деле: данные в полях типа UtcDateTime хранятся в UTC (сюрприз! ), поэтому присвоение значения поля переменной никак это значение автоматически не меняет - это только на формах ядро умеет автоматом переводить значения из UTC во временную зону, настроенную у пользователя, при отображении и обратно - при редактировании значения поля. В коде же нужно самостоятельно переводить значение из UTC в нужную временную зону, если есть такая потребность.
Старый 12.10.2011, 08:14   #12  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Ничего такого не происходит на самом деле: данные в полях типа UtcDateTime хранятся в UTC (сюрприз! ), поэтому присвоение значения поля переменной никак это значение автоматически не меняет - это только на формах ядро умеет автоматом переводить значения из UTC во временную зону, настроенную у пользователя, при отображении и обратно - при редактировании значения поля. В коде же нужно самостоятельно переводить значение из UTC в нужную временную зону, если есть такая потребность.
Так в том то и дело что в таблице данные имеют тип TransDateTime и время там записано не UTC а GMT + 3 и когда я считываю это поле и записываю в переменную или в другую таблицу он автоматически переводит это время в UTC то есть отнимает 3 часа.
Старый 12.10.2011, 08:38   #13  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Это заблуждение: время в полях базового типа UtcDateTime (включая TransDateTime) хранится в UTC - именно в этом и смысл таких полей (ну, помимо хранения времени в том же поле), именно поэтому базовый тип называется так, а не просто DateTime, однако, при отображении на форме, включая обозреватель таблиц, ядро автоматически переводит такие значения в настроенную у пользователя временную зону. В качестве эксперимента можно попробовать вывести в инфолог значение такого поля без присваивания его промежуточной переменной и убедиться, что никаких +3 часов там не будет.
Старый 12.10.2011, 11:51   #14  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
X++:
while select sysUserLogCreate
            where   sysUserLogCreate.createdDateTime > dateFrom &&
                        sysUserLogCreate.createdDateTime < dateTo
                      {. . .
Смотрим в отладчике что у нас в переменной sysUserLogCreate (1 вложение)

Теперь смотрим через обозреватель таблиц ту же запись, там совсем другое время, меня интересует при таком преобразовании насколько будет верным сравнение в вышеуказанном коде (2 вложение)
Изображения
  
Старый 12.10.2011, 12:23   #15  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от AngelDominantes Посмотреть сообщение
Смотрим в отладчике что у нас в переменной sysUserLogCreate (1 вложение). Теперь смотрим через обозреватель таблиц ту же запись, там совсем другое время

Цитата:
Сообщение от gl00mie Посмотреть сообщение
данные в полях типа UtcDateTime хранятся в UTC - это только на формах ядро умеет автоматом переводить значения из UTC во временную зону, настроенную у пользователя, при отображении
Обозреватель таблиц с т.з. ядра - тоже форма... Отладчик же при отображении данных типа UtcDateTime всегда показывает их "как есть".
Старый 12.10.2011, 13:29   #16  
AngelDominantes is offline
AngelDominantes
Участник
 
76 / 9 (1) +
Регистрация: 30.12.2010
Понятно спасибо, я думал обозреватель таблиц показывает "как есть".
Теги
utcdatetime

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptapedia: Current Time Blog bot DAX Blogs 1 29.11.2010 22:11
emeadaxsupport: Passing UtcDateTime values in extended query syntax Blog bot DAX Blogs 0 10.05.2010 21:05
Kashperuk Ivan: UtcDateTime in Dynamics AX 2009 Blog bot DAX Blogs 0 17.02.2010 15:05
axaptapedia: UtcDateTime Blog bot DAX Blogs 0 23.07.2009 01:05
DAX 2009 & UtcDateTime & Primary Key SRF DAX: Программирование 8 05.06.2009 07:05

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:10.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.