Версия данной статьи для Microsoft Access 97:
130514 (Эта ссылка может указывать на содержимое полностью или частично на английском языке).

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

Аннотация

В данной статье содержатся сведения о хранении типа данных "Дата/Время" в Microsoft Access. В данной статье также рассматриваются причины возможного получения неожиданных результатов при вычислении и сравнении дат и времени.

Эта статья содержит следующие разделы.

  • Хранение данных в формате даты/времени

  • Форматирование поля даты/времени

  • Вычисление времени

  • Сравнение дат

  • Сравнение времени

Дополнительная информация

Хранение данных в формате даты/времени

Тип данных "Дата/Время" хранится в Access в формате числа двойной точности с плавающей запятой и числом десятичных разрядов до 15. Целая часть числа двойной точности представляет собой дату. Дробная часть представляет время.

Дата может принимать значения от -657 434 (1 января 100 г. н.э.) до 2 958 465 (31 декабря 9999 г. н.э.). Нулевому значению даты соответствует 30 декабря 1899 г. Даты до 30 декабря 1899 г. хранятся в Access в виде отрицательных чисел.

Время может принимать значения от 0,0 (00:00:00) до 0,99999 (23:59:59). Числовое значение представляет собой долю дня. Можно перевести числовое значение в часы, минуты и секунды, умножив его на 24.

В следующей таблице показано, как хранятся значения даты/времени в Access:
Двойное Составляющая Реальная Составляющая Реальное
число даты дата времени время
------------------------------------------------------------------

1,0 1 31 декабря 1899 г. 0,0 00:00:00
2,5 2 1 января 1900 г. 0,5 12:00:00
27468,96875 27468 15 марта 1975 г. 0,96875 23:15:00
36836,125 36836 6 ноября 2000 г. 0,125 3:00:00
Чтобы просмотреть, как значения даты/времени сохраняются в Access в виде чисел, введите в окно проверки следующие команды, нажмите клавишу ENTER, а затем проверьте результаты:

?CDbl(#5/18/1999 14:00:00#) Результат: 36298.5833333333

?CDbl(#12/14/1849 17:32:00#) Результат: -18278.7305555556

Чтобы просмотреть числовые значения в виде даты и времени, введите в окно проверки следующие команды, нажмите клавишу ENTER, а затем проверьте результаты:

?CVDate(1.375) Результат: 12/31/1899 9:00:00 AM

?CVDate(-304398.575) Результат: 8/1/1066 1:48:00 PM

Форматирование поля даты/времени

Можно отформатировать значение даты/времени таким образом, чтобы отображалась дата, время или то и другое. При использовании формата только даты значение составляющей времени в Access равняется нулю. При использовании формата только времени значение составляющей даты в Access равняется нулю.

В следующей таблице показано, как хранятся значения даты/времени в Access. В следующей таблице также показано, как отобразить эти значения с помощью разных форматов:
Хранимое значение Стандартный формат Пользовательский формат
(двойное число) (Полный формат даты) (дд/мм/гггг чч:мм:сс)
---------------------------------------------------------------------

36295,0 5/15/99 15/05/1999 00:00:00
0,546527777777778 1:07 PM 30/12/1899 13:07:00
36232,9375 3/13/99 10:30PM 13/03/1999 22:30:00
Примечание Стандартным форматом для значений даты/времени является "Полный формат даты". Если значение содержит только дату, время не отображается. Если значение содержит только время, дата не отображается.

Вычисление времени

Поскольку значение времени сохраняется в качестве доли 24-часового дня, при вычислении временных интервалов продолжительностью более 24 часов можно получить результат с неверным форматированием. Для обхода этой проблемы можно создать пользовательскую функцию, обеспечивающую верное форматирование временных интервалов.

Корпорация Майкрософт предлагает примеры программного кода только для иллюстрации никаких гарантий, явных или подразумеваемых, в том числе относительно их пригодности для применения в пользовательских приложениях. Примеры в данной статье рассчитаны на пользователя, имеющего достаточный уровень знаний соответствующего языка программирования и необходимых средств разработки и отладки. Специалисты служб технической поддержки Майкрософт могут пояснить назначение тех или иных конструкций кода в конкретном примере, но модификация примеров и их адаптация к задачам разработчика не предусмотрена. Для верного вычисления и форматирования временных интервалов выполните следующие действия:

  1. Создайте модуль, а затем введите в раздел описаний следующую строку (если ее там еще нет):

    Option Explicit
  2. Введите следующую процедуру:

    '------------------------------------------------------------------
    ' Данная функция вычисляет время, прошедшее между двумя значениями,
    ' а затем форматирует результат четырьмя разными способами.
    '
    ' Функция принимает аргументы интервалов в следующем виде:
    '
    ' #5/12/95 6:00:00AM# - #5/11/95 10:00:00PM#
    '
    '
    '
    ' [Время окончания]-[Время начала]
    '------------------------------------------------------------------

    Function ElapsedTime (Interval)
    Dim x
    x = Int(CSng(Interval * 24 * 3600)) & " секунд"
    Debug.Print x
    x = Int(CSng(Interval * 24 * 60)) & ":" & Format(Interval, "ss") _
    & " минут:секунд"
    Debug.Print x
    x = Int(CSng(Interval * 24)) & ":" & Format(Interval, "nn:ss") _
    & " часов:минут:секунд"
    Debug.Print x
    x = Int(CSng(Interval)) & " дней " & Format(Interval, "hh") _
    & " часов " & Format(Interval, "nn") & " минут " & _
    Format(Interval, "ss") & " секунд"
    Debug.Print x

    End Function
  3. Скопируйте в окно проверки приведенную ниже строку и нажмите клавишу ENTER:

    ? ElapsedTime(#6/1/1999 8:23:00PM#-#6/1/1999 8:12:12AM#) Просмотрите отображаемые значения:

    43848 секунд
    730:48 минут:секунд
    12:10:48 часов:минут:секунд
    0 дней 12 часов 10 минут 48 секунд

Сравнение дат

Поскольку даты и время хранятся совместно в виде чисел двойной точности, при сравнении данных в формате даты/времени можно получить неожиданные результаты. Например, при вводе в окно проверки приведенного ниже выражения будет получен результат False, даже если сегодняшння дата - 31/03/1999:

? Now()=DateValue("3/31/1999") Функция Now() возвращает число двойной точности, представляющее собой текущие дату и время. Однако функция DateValue() возвращает целое число, представляющее собой дату без дробного значения времени. Таким образом, Now() равняется DateValue() только в случае, если функция Now() возвращает значение времени "00:00:00".

Для получения верных результатов при сравнении значений даты используйте одну из следующих функций. Чтобы проверить работу каждой функции, введите функцию в окно проверки, замените текущую дату на 31/03/1999, а затем нажмите клавишу ENTER:

  • Чтобы возвращаемое значение было целым числом, воспользуйтесь функцией Date():

    ?Date()=DateValue("3/31/1999")

  • Чтобы убрать дробную часть возвращаемого функцией Now() значения, воспользуйтесь функцией Int():

    ?Int(Now())=DateValue("3/31/1999")

Сравнение времени

При сравнении значений времени можно получить противоречивые результаты, поскольку значение времени хранится как дробная часть числа двойной точности с плавающей запятой. Например, при вводе в окно проверки приведенного ниже выражения будет получен ложный результат (0), даже если два значения времени выглядят одинаково:

var1 = #2:01:00 PM#
var2 = DateAdd("n", 10, var1)
? var2 = #2:11:00 PM# Когда Access преобразует значение времени в дробь, вычисленный результат может не совпадать со значением времени. Незначительной разницы, создаваемой при вычислении, достаточно для получения ложного результата (0) при сравнении сохраненного значения с постоянным.

Для получения верных результатов при сравнении значений времени воспользуйтесь одним из следующих методов. Чтобы проверить каждый метод, введите метод в окно проверки, а затем нажмите клавишу ENTER:

Добавьте к сравнению времени соответствующую дату:

var1 = #1/1/99 2:01:00 PM#
var2 = DateAdd("n", 10, var1)
? var2 = #1/1/99 2:11:00 PM#Перед сравнением преобразуйте значения времени в строковый тип данных:

var1 = #2:01:00 PM#
var2 = DateAdd("n", 10, var1)
? CStr(var2) = CStr(#2:11:00 PM#)Для сравнения точных элементов, например секунд, воспользуйтесь функцией DateDiff():

var1 = #2:01:00 PM#
var2 = DateAdd("n", 10, var1)
? DateDiff("s", var2, #2:11:00 PM#) = 0

Ссылки

Дополнительные сведения о вычислении значений даты и времени см. в следующей статье базы знаний Майкрософт:

210604 Функции вычисления и отображения значений даты и времени в AccessДля просмотра дополнительных сведений о форматировании типов данных даты/времени выберите команду Справка: Microsoft Access в меню Справка, введите строку свойство формата - тип данных даты/времени в соответствующем поле окна мастера ответов или помощника и нажмите кнопку Найти.

Нужна дополнительная помощь?

Совершенствование навыков
Перейти к обучению
Первоочередный доступ к новым возможностям
Присоединение к программе предварительной оценки Майкрософт

Были ли сведения полезными?

Насколько вы удовлетворены качеством перевода?

Что повлияло на вашу оценку?

Добавите что-нибудь? Это необязательно

Спасибо за ваш отзыв!

×