AXForum  
Вернуться   AXForum > Прочие обсуждения > Детская
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.07.2009, 19:22   #1  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
40 тыщ дней от Microsoft
Ввожу сегодня текущую дату 08.07.2009 в ячейку Excel, а потом случайно сдергиваюсь форматом на General. В ячейке - 40002. Вау! Оказывается понедельник, 06.07.2009, был "в Excel" днём 40000!

Ну, тут же само собой воодушевленный и Аксапточку проверяю:

X++:
static void Job192(Args _args)
{
    ;
    box::info(strFmt('%1', date2num(08\07\2009)));
}
Ух ты, в Аксапточке сегодня - день 40000!

Так что поздравляю всех любителей подобной нумерологии!

P.S. Разница в 2 дня чем-то, вроде, объясняется. Но чем именно, я навскидку не помню.
За это сообщение автора поблагодарили: mazzy (2).
Старый 08.07.2009, 23:13   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
В Excel дата 00.01.1900 соответствует значению 0 в типе дата, а в Ax - это 01.01.1900. Это первый сдвиг в датах.

А второй объясняется тем, что в Excel 1900 год считается високосным, хотя в действительности (и Ax так и считает) это был невисокосный год.
Цитата:
Сообщение от Википедия
Проблемы с датой

В версиях Excel до 2007 включительно 1900 год ошибочно считался високосным. Ошибка возникла в Lotus 1-2-3 и была намеренно внесена в Excel и поддерживалась для обратной совместимости.
По-моему, по этому поводу еще Спольски писал
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Gustav (2), Roumed (1).
Старый 09.07.2009, 09:46   #3  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от AndyD Посмотреть сообщение
В Excel дата 00.01.1900 соответствует значению 0 в типе дата, а в Ax - это 01.01.1900.
На деле обнаруживается, что функция date2num возвращает 0 для любой даты 1900 года - в том числе и для "ошибочной" 29\02\1900 и даже для даты-призрака 00\01\1900. И лишь 01\01\1901 сразу становится видно это расхождение в 2 дня: 365 - в Аксапте и 367 - в Excel.

Припоминаю похожее обсуждение на эту тему: dateNull() и endMth()

P.S. Хм... интересно, что Аксапта, похоже, проверяет литерал даты на корректность не как единую дату, а по отдельности - день, месяц, год. При этом дни считаются корректными в диапазоне от 1 до 31 для ЛЮБОГО (!) месяца. Поэтому становится возможным ввести дату 31 февраля 2009 года. При этом функция date2num возвращает целое значение для ближайшего предыдущего реально существующего дня, т.е. для 28.02.2009. И лишь 32-е февраля наконец-таки вызывает ошибку компиляции:

X++:
static void Job192(Args _args)
{
    ;
    info(strFmt('27 - %1', date2num(27\02\2009))); // 39869

    info(strFmt('28 - %1', date2num(28\02\2009))); // 39870
    info(strFmt('29 - %1', date2num(29\02\2009))); // 39870 -- несуществ.
    info(strFmt('30 - %1', date2num(30\02\2009))); // 39870 -- несуществ.
    info(strFmt('31 - %1', date2num(31\02\2009))); // 39870 -- несуществ.

    //info(strFmt('32 - %1', date2num(32\02\2009))); -- ошибка компиляции

    info(strFmt('01 - %1', date2num(01\03\2009))); // 39871
}
Ax 3.0 SP4

Последний раз редактировалось Gustav; 09.07.2009 в 10:09.
Старый 09.07.2009, 10:10   #4  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от Gustav Посмотреть сообщение
На деле обнаруживается, что функция date2num возвращает 0 для любой даты 1900 года - в том числе и для "ошибочной" 29\02\1900 и даже для даты-призрака 00\01\1900.
Да-да. И не только для date2num.

Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Хочется добавить, что ЛЮБЫЕ даты 1900-го года воспринимаются также как datenull().
X++:
date d = 31\12\1900; 
if (!d)
{
    info("пусто!");
}
__________________
С уважением,
Олег.
Старый 09.07.2009, 10:43   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
С годами - тоже занятно. Известно, что максимальная дата в Аксапте - это 31\12\2153 (возвращается функцией maxdate). Для этого дня date2num вернет свое максимальное значение: date2num(31\12\2153) = 92771.

Но для любой даты следующего, 2154-го, ошибки не будет. И только если написать в коде 01\01\2155, то возникнет ошибка компиляции с сообщением "Год вышел за пределы 1900-2150" (2150! не 2153, не 2154 ).

Обнаружено также, что date2num будет возвращать 0 для любой даты 2154 года (также как и для 1900).

P.S. Интересное обсуждение про "недодачу" двух лет для диапазонов было здесь: неккоректная(?) работа функции maxdate()
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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