Хранение, вычисление и сравнение данных даты и времени в Microsoft Access

Сводка

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

В этой статье описываются следующие разделы:

  • Хранение данных даты и времени
  • Форматирование поля даты и времени
  • Вычисление данных о времени
  • Сравнение данных о дате
  • Сравнение данных времени

Дополнительные сведения

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

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

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

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

В следующей таблице показано, как Access сохраняет значения даты и времени.

Двойное число Часть даты Фактическая дата Часть времени Фактическое время
1.0 1 31 декабря 1899 г. .0 12:00:00
2.5 2 1 января 1900 г. 0.5 12:00:00 вечера
27468.96875 27468 15 марта 1975 г. .96875 23:15:00
36836.125 36836 6 ноября 2000 г. .125 3:00:00

Чтобы просмотреть, как Access сохраняет значения даты и времени в виде чисел, введите следующие команды в окне Интерпретация, нажмите клавишу ВВОД и обратите внимание на результаты:

? CDbl(#5/18/1999 14:00:00#)

Результат равен: 36298,5833333333333

? CDbl(#12/14/1849 17:32:00#)

Результат равен: -18278,730555556

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

? CVDate(1.375)

Результат равен: 31.12.1899 9:00:00 AM

? CVDate(-304398.575)

Результат равен: 01.08.1066 13:48:00

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

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

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

Хранимое значение (двойное число) Формат по умолчанию (общая дата) Пользовательский формат (мм/дд/гггг чч:nn:сс A.M./P.M.)
36295.0 5/15/99 15.05.1999 12:00:00 AM
0.546527777777778 13:07 30.12.1899 13:07:00
36232.9375 3/13/99 10:30 ВЕЧЕРА 13.03.1999 22:30:00

Примечание Формат по умолчанию для значения даты и времени — Общая дата. Если значение имеет значение только даты, время не отображается. Если значение равно времени, дата не отображается.

Вычисление данных о времени

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

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

  1. Создайте модуль, а затем введите следующую строку в разделе Объявления, если следующая строка еще не указана:

    Option Explicit

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

    '------------------------------------------------------------------
    '  This function calculates the elapsed time between two values and then
    '  formats the result in four different ways.
    '
    '  The function accepts interval arguments such as the following:
    '
    '     #5/12/95 6:00:00AM# - #5/11/95 10:00:00PM#
    '
    '
    '
    '     [End Time]-[Start Time]
    '------------------------------------------------------------------
    
    Function ElapsedTime (Interval)
      Dim x
      x = Int(CSng(Interval * 24 * 3600)) & " Seconds"
      Debug.Print x
      x = Int(CSng(Interval * 24 * 60)) & ":" & Format(Interval, "ss") _
         & " Minutes:Seconds"
      Debug.Print x
      x = Int(CSng(Interval * 24)) & ":" & Format(Interval, "nn:ss") _
         & " Hours:Minutes:Seconds"
      Debug.Print x
      x = Int(CSng(Interval)) & " days " & Format(Interval, "hh") _
         & " Hours " & Format(Interval, "nn") & " Minutes " & _
         Format(Interval, "ss") & " Seconds"
      Debug.Print x
    
    End Function
    
  3. Введите следующую строку в окне Интерпретация и нажмите клавишу ВВОД:

    ? ElapsedTime(No 6/1/1999 8:23:00PM#-#6/1/1999 8:12:12AM#)

Обратите внимание, что отображаются следующие значения:

43848 Seconds
730:48 Minutes:Seconds
12:10:48 Hours:Minutes:Seconds
0 days 12 Hours 10 Minutes 48 Seconds

Сравнение данных о дате

Так как даты и время хранятся вместе в виде чисел двойной точности, при сравнении данных даты и времени могут возникнуть непредвиденные результаты. Например, если ввести следующее выражение в окне Интерпретация, вы получите результат False, даже если сегодняшняя дата — 31.03.1999:

? Now()=DateValue("31.31.1999")

Функция Now() возвращает число двойной точности, представляющее текущую дату и текущее время. Однако функция DateValue() возвращает целочисленное число, представляющее дату, но не дробное значение времени. Таким образом, значение Now() равно Значению DateValue() только в том случае, если Now() возвращает время 00:00:00 (12:00:00).

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

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

    ? Date()=DateValue("31.31.1999")

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

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

Сравнение данных времени

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

var1 = #2:01:00 PM#

var2 = DateAdd("n", 10, var1)

? var2 = #2:11:00 PM#

Когда Access преобразует значение времени в дробь, вычисляемый результат может не совпадать со значением времени. Небольшая разница, вызванная вычислением, достаточна для получения ложного результата (0) при сравнении сохраненного значения с константным значением.

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

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

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

Ссылки

Дополнительные сведения о вычислении значений даты и времени см. в разделе DateSerial Function

Для получения дополнительных сведений о форматировании типов данных даты и времени выберите Пункт Справка Microsoft Access в меню Справка , введите свойство format — тип данных даты и времени в помощнике по Office или мастере ответов, а затем нажмите кнопку Поиск , чтобы просмотреть раздел.