вычесть даты в веб-запросах Access 2010

Мне нужно отображать только записи, где datediff("d",date1,date2)>10

datediff не является «веб-совместимым». Что может быть обходным путем?


person Dan    schedule 25.06.2010    source источник
comment
По умолчанию в Access для вычитания дат используются дни, поэтому date1-date2=days. Я не знаю, совместимо ли это с сетью   -  person Fionnuala    schedule 25.06.2010
comment
Конечно, это является! Значения даты Jet/ACE хранятся как двойные числа, где целая часть указывает дни. Единственная загвоздка в том, что поля хранят и дату, и время, и в этом случае вам нужно сначала разделить их на целочисленные значения.   -  person David-W-Fenton    schedule 26.06.2010


Ответы (1)


Для веб-запроса у вас нет функции dateDiff(), но, как отмечают другие, простая разница между двумя значениями даст вам количество дней.

Итак, в построителе запросов просто введите

DAYDIF: ([date2]-[date1])

И, в критериях, вы можете пойти:

> 10
person Albert D. Kallal    schedule 26.06.2010
comment
Как вы выполняете вычисления даты/времени в веб-запросах, отличных от дней? А как насчет проблемы, если какое-либо из значений имеет части времени (которые могут изменить результаты)? - person David-W-Fenton; 27.06.2010
comment
Ну, у вас есть функции Hour() min(). У вас также есть DateSerial(Year,Month,Day), а также функции Year(), month(), day(). Итак, между этим набором функций вы не в слишком плохой форме. - person Albert D. Kallal; 27.06.2010
comment
Но на самом деле они не заменяют DateDiff(), потому что у них нет встроенных знаний календаря. Например, добавление 1 месяца с помощью DateSerial() и Month() не обязательно даст вам тот же результат, что и DateDiff(). - person David-W-Fenton; 29.06.2010
comment
Это даст вам тот же результат, если вы используете серийный номер даты. поэтому оба дадут вам один и тот же результат: DateAdd (m, 1, MyDt) или DateSerial (Year (MyDt), Month (MyDt) + 1, Day (MyDt)) - person Albert D. Kallal; 29.06.2010
comment
Но DateAdd(m,1,#1/31/2009#) и DateSerial(Year(#1/31/2009#),Month(#1/31/2009#)+1, Day(#1/31/2009#) #)) не совпадают даты. Это своего рода моя точка зрения. - person David-W-Fenton; 30.06.2010
comment
Ах я вижу. Это зависит от того, как вы хотите определить месяцы. В вашем примере вы уже в последний день месяца. Вы можете использовать длинный трюк DateSerial(Year(dt), Month(dt) + 2, 0), и это всегда приведет вас к концу следующего месяца меньше 1 (в том числе, когда наступает високосный год). По моему опыту, если это не конец или начало месяца, то я не могу сказать, что когда-либо использовал dateadd() со значениями с середины месяца и добавлял 1 к этому значению. Вышеупомянутый трюк действительно позволяет диапазону одного месяца скобки с правильными концами месяца, но, как вы указываете, все еще происходит функциональная потеря. - person Albert D. Kallal; 30.06.2010
comment
Это не я определяю месяцы — это часть встроенной обработки даты. Разложение даты на составляющие ее числа, выполнение над ними арифметической операции и последующая повторная сборка с помощью DateSerial() не использует преимуществ таблиц календаря, стоящих за DateAdd() и DateDiff(). Нужен он вам или нет — вопрос открытый, но дело в том, что без DateAdd() приходится использовать гораздо более сложные выражения. - person David-W-Fenton; 01.07.2010
comment
Как уже упоминалось, мне было трудно придумать приложения, в которых мне нужна эта возможность. Так что да, мы теряем некоторые функции здесь, но по большей части это не большая потеря. Я не пишу ничего, кроме систем бронирования, которые имеют дело с датами. Я не могу вспомнить, где мне нужно добавить один месяц к 30-му, а в следующем месяце 31 день, но в результате я все еще хочу 30-е число. В моих случаях я хотел ПОСЛЕДНИЙ день месяца. Итак, DateSerial со значением day = 0 ДЕЙСТВИТЕЛЬНО дает мне дату конца месяца в календаре. Если эти простые обходные пути не применимы, эта проблема будет более убыточной. но для меня это не было проблемой. - person Albert D. Kallal; 01.07.2010
comment
Таким образом, вы не будете использовать DateDiff() в первую очередь. Я полагаюсь на DateDiff() (и DateAdd()), потому что он знает о календаре и выдает результаты, на которые я могу положиться. Выполнение моих собственных вычислений с помощью DateSerial() — это не то, чего я жду в веб-формах. - person David-W-Fenton; 02.07.2010