Книга знаний

1С:Предприятие / v8

v8: Дата и время в 8.0

Все про даты.Автор статьи:
Последняя редакция №1 от 10.03.05
URL: http://kb.mista.ru/article.php?id=39


Хранение дат в системе



В базе данных даты хранятся с точностью до секунд.
Для реквизитов типа "дата" можно установить вариант хранения "дата и время", "только дата", "только время".

Переменные типа "дата" всегда представляют дату с секундами. Отсчет дат ведется с Рождества Христова (наша эра), т.е. с 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)
ИЗ РегистрСведений.КурсыВалют

См. также функции языка запросов:
НачалоПериода
КонецПериода


Другие объекты


см. также МоментВремени, метод Сравнить
метод ПолучитьОтметкуВремени

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика