v8: Дата и время в 8.0
Хранение дат в системе
В базе данных даты хранятся с точностью до секунд.
Для реквизитов типа "дата" можно установить вариант хранения "дата и время", "только дата", "только время".
Переменные типа "дата" всегда представляют дату с секундами. Отсчет дат ведется с Рождества Христова (наша эра), т.е. с 01.01.0001 00:00:00 по Григорианскому календарю. Начальная дата - это не совсем дата. Это значение в системе используется для представления "пустой даты" (аналог пустой ссылки для ссылочных типов или пустой строки "" для строкового типа).
На самом деле, переменные типа "дата" хранят дату с миллисекундами, что выясняется путем присвоения дате дробного числа и вычитании исходной даты, например:
НекаяДата = РабочаяДата();
НекаяДатаСМиллисекундами = НекаяДата + 0.345;
Миллисекунды = (НекаяДатаСМиллисекундами - НекаяДата)*1000; //=345
Любой документ в системе имеет дату и время. Все это хранится в поле "Дата" (не ДатаДок, как было в 7.7)
Другие операции с датами
Записать месяц прописью: Формат(Дата,"ДММММ"); //25.01.2005 => Январь
Формат(Дата,"ДДД.ММ.ГГГГ"); //традиционный российский формат 31.12.2005
см. также функцию ОписаниеПериода(Дата1,Дата2)
см. также процедуру ВвестиЗначение и объект ВыборИнтервала (название нужно уточнить)
Для преобразования строки в дату нужно сделать так:
НекаяДата = Дата("2005-01-05"); //разделители могут быть любые, порядок компонентов даты критичен
Во встроенном языке литералы даты записываются в апострофах. Компоненты даты должны быть по порядку: год, месяц, день, час, минута, секунда. Последние 3 можно опускать, например, не указывать минуты и секунды.
см. также функции НачалоМесяца, КонецМесяца, НачалоДня, КонецДня, НачалоГода, КонецГода и аналогичные.
При формировании отчетов за период не забывайте преобразовывать конечную дату к КОНЦУ ДНЯ.
Проверка на пустую дату
1. Если Дата = '00010101' Тогда
2. Если Дата = '0001-01-01' Тогда
3. Если Дата = '00010101000000' Тогда
В типовых конфигурациях есть функция ЗначениеНеЗаполнено, которая использует этот способ.
В запросах можно делать так:
1. ГДЕ Дата = ДАТАВРЕМЯ(0001,01,01,0,0,0)
2. ГДЕ Дата = &ПустаяДата
Запрос.УстановитьПараметр("ПустаяДата",'00010101');
Арифметические операции с датами
При вычислении разницы между датами результат - это количество СЕКУНД между ними.
Для вычисления разницы в СУТКАХ нужно количество секунд разделить на 86400 (т.е. 24*60*60).
Для получения разницы в рабочих днях нужно завести календарь (регистр сведений) и отсчитывать дни по нему.
При сложении/вычитании даты и какого-то числа оно рассматривается как количество СЕКУНД.
Даты нельзя складывать друг с другом.
Даты можно сравнивать друг с другом (=,<>, >, <, <=, >=). Их также можно передавать в функции Макс и Мин.
Операции с датами в запросах
РАЗНОСТЬДАТ(<Дата1>, <Дата2>, <Тип>)
Пример:
Выбрать РАЗНОСТЬДАТ(Период, &РабДата, Секунда)
ИЗ РегистрСведений.КурсыВалют
вместо "Секунда" может быть Минута, Час, День, Месяц, Год
Есть также функция ДОБАВИТЬКДАТЕ
ДОБАВИТЬКДАТЕ(<Дата>, <Тип>, <Количество>)
Пример:
Выбрать ДОБАВИТЬКДАТЕ(Период, Месяц, 2)
ИЗ РегистрСведений.КурсыВалют
См. также функции языка запросов:
НачалоПериода
КонецПериода
Другие объекты
см. также МоментВремени, метод Сравнить
метод ПолучитьОтметкуВремени |