Access вычитание дат - IT Новости из мира ПК
Semenalidery.com

IT Новости из мира ПК
402 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Access вычитание дат

Арифметические операции над значениями даты/времени в PL/SQL

Основные операции над значениями даты/времени в Oracle сводятся к следующему набору:

  • Прибавление или вычитание интервала из значения даты/времени.
  • Вычитание одного значения даты/времени из другого для определения интервала между двумя значениями.
  • Прибавление или вычитание одного интервала из другого.
  • Умножение или деление интервала на число.

По историческим причинам я раздельно рассматриваю арифметические операции со значениями типа DATE и операции, в которых задействованы типы семейств TIMESTAMP и INTERVAL .

Операции с типами TIMESTAMP и INTERVAL

Вычисления с интервалами «дни/секунды» легко выполняются при работе с типами данных семейства TIMESTAMP . Создайте значение INTERVAL DAY TO SECOND и используйте его при сложении и вычитании. Например, прибавление к текущей дате 1500 дней, 4 часов, 30 минут и 2 секунд выполняется следующим образом:

С интервалами «годы/месяцы» дело обстоит сложнее. Продолжительность любого дня составляет 24 часа, или 1440 минут, или даже 86 400 секунд, но не все месяцы имеют одинаковую продолжительность в днях: 28, 29, 30 или 31 день. По этой причине простое прибавление одного месяца к дате может привести к неоднозначному результату. Допустим, вы прибавляете один месяц к последнему дню мая; что получится — последний день июня или недействительная дата 31 июня? Все зависит от того, что должны представлять интервалы.

Oracle предоставляет необходимые средства для получения любого из этих результатов. Программист сам решает, какой вариант поведения должен реализоваться системой. Если конец месяца должен быть преобразован в конец месяца (31 мая + 1 месяц = 30 июня), используйте функцию ADD_MONTHS . Если изменение дня месяца нежелательно, используйте значение INTERVAL YEAR TO MONTH . В этом случае при прибавлении к 31 мая 2008 года INTERVAL ‘1’ MONTH будет получено значение 31 июня 2008 года, а СУБД выдаст сообщение об ошибке.

Вычисления с типом INTERVAL YEAR TO MONTH лучше зарезервировать для тех значений даты/времени, которые усекаются по началу месяца или, скажем, по 15 числу — они плохо подходят для конца месяца. Если вам потребуется прибавить или вычесть сколько-то месяцев (или лет — аналогичная проблема возникает при прибавлении одного кода к 29 февраля 2008 года) из даты, в которой может быть задействован конец месяца, используйте функцию ADD_MONTHS . Эта функция, возвращающая тип DATE , решает проблему преобразованием соответствующих дат в последний день месяца вместо выдачи ошибки. Например, ADD_MONTHS(’31-May-2008′,1) вернет 30 июня 2008 года. Полученное значение DATE не содержит данных часового пояса (или долей секунд); если в результате должны присутствовать эти компоненты, вам придется реализовать дополнительную логику извлечения и повторного внесения этих компонентов в результат.

Аналогичной функции вычитания SUBTRACT_MONTHS не существует, но ADD_MONTHS можно вызывать с отрицательным количеством месяцев. Например, вызов ADD_MONTHS(current_date, -1) в приведенном примере вернет дату за один месяц до последнего дня апреля.

Операции с типом DATE

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

Прибавление четырех часов к текущей дате и времени:

Обратите внимание на использование дроби 4/24 вместо 1/6. При чтении кода сразу становится ясно, что значение, возвращаемое SYSDATE , увеличивается на 4 часа; а если использовать 1/6, программист, который будет заниматься сопровождением кода, будет долго ломать голову над тем, что должна означать эта таинственная дробь. Для еще более явного выражения намерений можно воспользоваться именованной константой:

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

Access вычитание дат

Как в Access»e в запросе(созданом внутри базы) показать записи профильтрованые па полю дата(все записи за текущий месяц)


Digitman © ( 2004-08-18 13:08 ) [1]

SELECT [Бухгалтерские проводки].*, Month([DAT]) AS Выражение2
FROM [Бухгалтерские проводки]
WHERE (((Year([DAT]))=Year(Date())) AND ((Month([DAT]))=Month(Date())));


surkis ( 2004-08-18 13:49 ) [2]

Спасибо 🙂
А можно ли в запросе создать поле которое будет показывать разницу двух полей типа Дата/Время в которых зафиксировано время


Digitman © ( 2004-08-18 14:05 ) [3]


surkis ( 2004-08-18 14:12 ) [4]


zx © ( 2004-08-18 14:25 ) [5]

ДатаВремя1-ДатаВремя2 as Поле


Digitman © ( 2004-08-18 14:26 ) [6]

давай-ка уже думай сам

значение типа Дата/Время есть ни что иное как значение типа Double, в котором целая часть отражает кол-во суток, прошедших со времен царя Гороха, а дробная часть — число миллисекунд, прошедших с начала тек.суток

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

число дней умножаешь на 24 (часа в сутках), прибавляешь значение ф-ции Hour(разница) — это будет разница в часах

ф-ция Minute(разница) покажет минуты

ф-ция Second(разница) покажет секунды


surkis ( 2004-08-18 14:34 ) [7]

> ДатаВремя1-ДатаВремя2 as Поле
Я так и сделал но оно не работает! В Access»e Написал такой запрос «SELECT reg.userid, ([reg]![regTimeOut]-[reg]![regTimeIn]) AS [long1] FROM reg (где reg — талица,userid — поле целое,regTimeOut и regTimeIn — поля Дата/Время)
«, делаю execute Он выводит поле userid правильно а в поле long1 пишет «#Ошибка»


Digitman © ( 2004-08-18 14:46 ) [8]

Читать еще:  Веб-разработки приложений

вычитание даты из даты — это бред !

вычитать следует вещ.число из вещ.числа, к каковым следует приводить значения полей типа дата/время (см. ф-цию CDbl()) перед тем как что-то из чего-то вычитать


surkis ( 2004-08-18 14:51 ) [9]

> вычитание даты из даты — это бред !

Может я не совсем понял что ты имеешь ввиду но так «SELECT reg.userid, CDate((CDbl([regTimeOut])-CDbl([regTimeIn]))) AS allTime FROM reg;» тоже не выходит


Digitman © ( 2004-08-18 17:09 ) [10]

что бы что-то вышло, надо чтобы это что-то для начала вошло !

любопытно вот мне, что же ты ожидал получить в рез-те преобразования CDate(разница_дабл_значений) ?

subtract dates in access 2010 web queries

I need to only display records where datediff(«d»,date1,date2)>10

datediff is not «web compatible». What would be a workaround?

Создан 25 июн. 10 2010-06-25 18:28:48 Dan

The default in Access for subtracting dates is days, so date1-date2=days. I do not know if this is web compatible – Fionnuala 25 июн. 10 2010-06-25 18:53:07

Of course it is! Jet/ACE date values are stored as doubles, with the integer part indicating the days. The only catch is if the fields store both date and time, in which case you need to strip them to integer values first. – David-W-Fenton 25 июн. 10 2010-06-25 23:26:00

1 ответ

For a web query, you don’t have dateDiff() function, but as the others point out, a simple difference between the two values will give you the number of days.

So in the query builder just type in

And, in the criteria, you can go:

How do you do date/time calculations in web queries other than days? And what about the problem if any of the values have time parts (which could change the results)? – David-W-Fenton 26 июн. 10 2010-06-26 22:15:21

Well, you do have the Hour() min(), functions. You also have DateSerial(Year,Month,Day), and you also have Year(), month(), day() functions. So, between this set of functions you not in too bad of shape. – Albert D. Kallal 27 июн. 10 2010-06-27 02:44:37

But those don’t really replace DateDiff(), because they don’t have built-in calendar knowledge. E.g., adding 1 month with DateSerial() and Month() won’t necessarily get you the same result as DateDiff(). – David-W-Fenton 28 июн. 10 2010-06-28 21:48:15

It will give you same result if you use date serial. so, both will give you the same result: DateAdd(«m», 1, MyDt) or DateSerial(Year(MyDt), Month(MyDt) + 1, Day(MyDt)) – Albert D. Kallal 29 июн. 10 2010-06-29 06:27:08

But DateAdd(«m»,1,#1/31/2009#) and DateSerial(Year(#1/31/2009#),Month(#1/31/2009#)+1, Day(#1/31/2009#)) are not the same dates. That’s kind of my point. – David-W-Fenton 29 июн. 10 2010-06-29 22:34:53

Ah, I see. This depends on how you want to define months. In your example you already on the last day of the month. You can use the long time trick of DateSerial(Year(dt), Month(dt) + 2, 0) and that will always jump you to the end of the next month less 1 (including when leap year occurs). In my experience if one is not at the end or start of the month, then I can’t say I ever used dateadd() with values from the «middle» of a month and added 1 to that value. Above trick does let one bracket month ranges with correct month ends but there is still a loss of functionally as you point out. – Albert D. Kallal 30 июн. 10 2010-06-30 02:54:06

It’s not me defining months — it’s part of the built-in date handling. Decomposing a date into its component numbers, doing an arithmetic operation on them and then reassembling with DateSerial() does not take advantage of the calendar tables behind DateAdd() and DateDiff(). Whether or not you need it is an open question, but the point is that without DateAdd(), you have to use much more complex expressions. – David-W-Fenton 01 июл. 10 2010-07-01 02:01:30

As mentioned I hard pressed to think of applications where I needed this ability. So yes we do loose some functionality here but for the most part it not a big loss. I write nothing but reservation systems that deal with dates. I can’t recall where I need to add one month to the 30 th and there is 31 days in the next month but I still want the 30 th as a result. In my cases I wanted the LAST month day. So DateSerial with day = 0 DOES give me that end of month date base on the calendar. If these easy workarounds don’t apply then this issue will be more of loss. but for me it been not a problem. – Albert D. Kallal 01 июл. 10 2010-07-01 04:11:23

Thus you wouldn’t be using DateDiff() in the first place. I rely on DateDiff() (and DateAdd()) because it knows about the calendar and produces results I can rely on. Rolling my own calculations with DateSerial() is not something I look forward to in web-only forms. – David-W-Fenton 02 июл. 10 2010-07-02 00:27:05

SQL функции даты и времени

Приветствую Вас, уважаемые читатели блога webcodius.ru. В базе данных часто требуется хранить различные данные связанные с датой и временем. Это может быть дата добавления информации, дата регистрации пользователя, время последней автоизации и другие данные. В языке SQL есть множество функций связанных с датой и временем, сегодня их и рассмотрим.

Читать еще:  Опен офис презентация

Все ниже рассмотренные функции работают с календарными типами данных.

Получение текущей даты и времени.

Чтобы получить текущую дату и время используется функция NOW ().

SELECT NOW ()
Результат: 2015-09-25 14:42:53

Для получения только текущей даты есть функция CURDATE ().

SELECT CURDATE ()
Результат: 2015-09-25

И функция CURTIME (), которая возвращает только текущее время:

SELECT CURTIME ()
Результат: 14:42:53

Функции CURDATE () и NOW () удобно использовать для добавления в базу данных записей, для которых требуется хранить дату добавления. Например, при добавлении статьи на сайт хорошо бы хранить ее дату публикации. Тогда запрос на добавление статьи в базу будет примерно таким:

INSERT INTO posts (id_post, text_post, date_publication) VALUES (1, ‘текст статьи’, NOW ());

Прибавление и вычитание дат и времени

Функция ADDDATE (date, INTERVAL value) прибавляет к дате date значение value и возвращает полученное значение. В качестве value могут выступать следующие значения:

  • SECOND — секунды
  • MINUTE — минуты
  • HOUR — часы
  • DAY — дни
  • WEEK — недели
  • MONTH — месяцы
  • QUARTER — кварталы
  • YEAR — годы

а также их комбинации:

  • MINUTE_SECOND — минуты и секунды
  • HOUR_SECONDчасы — минуты и секунды
  • HOUR_MINUTE — часы и минуты
  • DAY_SECOND — дни, часы, минуты и секунды
  • DAY_MINUTE — дни, часы и минуты
  • DAY_HOUR — дни и часы
  • YEAR_MONTH — года и месяцы.

SELECT ADDDATE (‘2015-09-28 10:30:20’, INTERVAL 1 DAY)
Результат: 2015-09-29 10:30:20

SELECT ADDDATE (‘2015-09-28 10:30:20’, INTERVAL ‘3 1:20’ DAY_MINUTE)
Результат: 2015-10-01 11:50:20

Функция SUBDATE (date, INTERVAL value) производит вычитание значения value из даты date . Пример:

SELECT SUBDATE (‘2015-09-28 10:30:20’, INTERVAL 20 HOUR)
Результат: 2015-09-27 14:30:20

Функция PERIOD_ADD (period, n) прибавляет к значению period n месяцев. Значение период должно быть представлено в формате YYYYMM (например сентябрь 2015 года будет 201509). Пример:

SELECT PERIOD_ADD (201509, 4)
Результат: 201601

Функция TIMESTAMPADD (interval, n, date) прибавляет к дате date временной интервал n , значения которого задаются параметром interval . Возможные значения параметра interval:

  • FRAC_SECOND — микросекунды
  • SECOND — секунды
  • MINUTE — минуты
  • HOUR — часы
  • DAY — дни
  • WEEK — недели
  • MONTH — месяцы
  • QUARTER — кварталы
  • YEAR — годы

SELECT TIMESTAMPADD (QUARTER, 1, ‘2015-09-28’)
Результат: 2015-12-28

Функция SUBTIME (date, time) вычитает из даты date время time. Пример:

SELECT SUBTIME (‘2015-09-28 10:30:20′, ’50:20:19’)
Результат: 2015-09-26 08:10:01

Вычисление интервала между датами

Функция TIMEDIFF (date1, date2) вычисляет разницу в часах, минутах и секундах между двумя датами date1 и date2 . Пример:

SELECT TIMEDIFF (‘2015-09-28 10:30:20’, ‘2015-09-29 10:30:20’)
Результат: -24:10:00

Функция DATEDIFF (date1, date2) вычисляет разницу в днях между двумя датами, при этом часы, минуты и секунды при указании дат игнорируются. Пример:

SELECT DATEDIFF (‘2015-09-28 00:00:20’, ‘2015-09-27 23:40:20’)
Результат: 1

С помощью этой функции легко определить сколько дней прошло с даты публикации статьи:

SELECT DATEDIFF (CURDATE (), date_publication) FROM posts WHERE id_post = 1

Функция PERIOD_DIFF (period1, period2) вычисляет разницу в месяцах между двумя датами. Даты должны быть представлены в формате YYYYMM . Например, узнаем сколько месяцев прошло с января 2015 по сентябрь 2015:

SELECT PERIOD_DIFF (201509, 201501)
Результат: 9

Функция TIMESTAMPDIFF (interval, date1, date2) вычисляет разницу между датами date2 и date1 в единицах указанных в параметре interval . При этом interval может принимать следующие значения:

  • FRAC_SECOND — микросекунды
  • SECOND — секунды
  • MINUTE — минуты
  • HOUR — часы
  • DAY — дни
  • WEEK — недели
  • MONTH — месяцы
  • QUARTER — кварталы
  • YEAR — годы

SELECT TIMESTAMPDIFF (HOUR, ‘2015-09-28 10:30:20’, ‘2015-09-28 19:50:20’)
Результат: 9

Получение различных форматов даты и времени и другой информации

Функция DATE (datetime) возвращает дату, отсекая время. Пример:

SELECT DATE (‘2015-09-28 10:30:20’)
Результат: 2015-09-28

Функция TIME (datetime) возвращает время, отсекая дату. Пример:

SELECT TIME (‘2015-09-28 10:30:20’)
Результат: 10:30:20

Функция TIMESTAMP (date) возвращает полный формат со временем даты date . Пример:

TIMESTAMP (‘2015-09-28’)
Результат: 2015-09-28 00:00:00

DAY (date) и DAYOFMONTH (date). Функции-синонимы, которые возвращают порядковый номер дня месяца. Пример:

SELECT DAY (‘2015-09-28’), DAYOFMONTH (‘2015-09-28’)
Результат: 28 | 28

Функции DAYNAME (date), DAYOFWEEK (date) и WEEKDAY (date). Первая функция возвращает название дня недели, вторая — номер дня недели (отсчет от 1 — воскресенье до 7 — суббота), третья также номер дня недели только другой отсчет(отсчет от 0 — понедельник, до 6 — воскресенье). Пример:

SELECT DAYNAME (‘2015-09-28’), DAYOFWEEK (‘2015-09-28’), WEEKDAY (‘2015-09-28’)
Результат: Monday 2 | 0

Функции WEEK (date) и WEEKOFYEAR (datetime). Обе функции возвращают номер недели в году, только у первой неделя начинается с воскресенья, а у второй с понедельника. Пример:

SELECT WEEK (‘2015-09-28 10:30:20’), WEEKOFYEAR (‘2015-09-28 10:30:20’)
Результат: 39 | 40

Функция MONTH (date) возвращает числовое значение месяца (от 1 до 12), а MONTHNAME (date) название месяца. Пример:

SELECT MONTH (‘2015-09-28 10:30:20’), MONTHNAME (‘2015-09-28 10:30:20’)
Результат: 9 | September

Функция QUARTER (date) возвращает номер квартала года (от 1 до 4). Пример:

SELECT QUARTER (‘2015-09-28 10:30:20’)
Результат: 3

Функция YEAR (date) возвращает значение года (от 1000 до 9999). Пример:

SELECT YEAR (‘2015-09-28 10:30:20’)
Результат: 2015

Читать еще:  Совместимость офис 2003

Функция DAYOFYEAR (date) возвращает порядковый номер дня в году (от 1 до 366). Прмиер:

SELECT DAYOFYEAR (‘2015-09-28 10:30:20’)
Результат: 271

Функция HOUR (datetime) возвращает значение часа (от 0 до 23). Пример:

SELECT HOUR (‘2015-09-28 10:30:20’)
Результат: 10

Функция MINUTE (datetime) возвращает значение минут (от 0 до 59). Пример:

SELECT MINUTE (‘2015-09-28 10:30:20’)
Результат: 30

Функция SECOND (datetime) возвращает значение секунд (от 0 до 59). Пример:

SELECT SECOND (‘2015-09-28 10:30:20’)
Результат: 20

Функция EXTRACT (type FROM date) возвращает часть даты date определяемую параметром type . Пример:

SELECT EXTRACT (YEAR FROM ‘2015-09-28 10:30:20’), EXTRACT (MONTH FROM ‘2015-09-28 10:30:20’), EXTRACT (DAY FROM ‘2015-09-28 10:30:20’), EXTRACT (HOUR FROM ‘2015-09-28 10:30:20’), EXTRACT (MINUTE FROM ‘2015-09-28 10:30:20’), EXTRACT (SECOND FROM ‘2015-09-28 10:30:20’)
Результат: 2015 | 9 | 28 | 10 | 30 | 20

Взаимообратные функции TO_DAYS (date) и FROM_DAYS (n). Первая преобразует дату в количество дней, прошедших с нулевого года. Вторая, наоборот, принимает число дней, прошедших с нулевого года и преобразует их в дату. Пример:

SELECT TO_DAYS (‘2015-09-28 10:30:20’), FROM_DAYS (736234)
Результат: 736234 | 2015-09-28

Взаимообратные функции UNIX_TIMESTAMP (date) и FROM_UNIXTIME (n). Первая преобразует дату в количество секунд, прошедших с 1 января 1970 года. Вторая, наоборот, принимает число секунд, с 1 января 1970 года и преобразует их в дату. Пример:

SELECT UNIX_TIMESTAMP (‘2015-09-28 10:30:20’), FROM_UNIXTIME (1443425420)
Результат: 1443425420 | 2015-09-28 10:30:20

Взаимообратные функции TIME_TO_SEC (time) и SEC_TO_TIME (n). Первая преобразует время в количество секунд, прошедших от начала суток. Вторая, наоборот, принимает число секунд с начала суток и преобразует их во время. Пример:

SELECT TIME_TO_SEC (’10:30:20′), SEC_TO_TIME (37820)
Результат: 37820 | 10:30:20

Функция MAKEDATE (year, n) принимает год year и номер дня в году n и преобразует их в дату. Пример:

SELECT MAKEDATE (2015, 271)
Результат: 2015-09-28

РазностьДат()

(1) Zircool,
Все не просто, а очень просто.
Разность дат — это секунды, т.е. когда из одной даты вычитаешь другую получаешь диапазон между ними в секундах.
допустим это «Х».
В часах У=Цел(Х/3600); — получаем диапазон в целых часах (ну тут можно и округление добавить т.е. если дробная часть больше 0.5 часа то увеличиваем на час больше).
Теперь нужно понять сколько цельных суток в этом диапазоне.
Z = Цел(Y/24);
И определяем оставшийся «хвостик» в часах (неполные сутки)
N = У — Z*24;
Т.к. в сутках мы решили что у нас 20 часов, то можем рассчитать диапазон в часах в «неземных» сутках.
h = Z*20+N;

Сами формулы можешь нарисовать красивей. Но ход мыслей расчета я думаю понятен.

(4) Zircool,
Вот с этого и надо было начинать.
Берем разность дат в часах и отнимаем разность дат в днях с погрешностью в 4 часа (т.к. нам нужно в сутках 20 часов).
строка в запросе будет выглядеть следующим образом

РАЗНОСТЬДАТ(Дата1, Дата2, ЧАС) — РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ) * 4 КАК ЧасыВМарсианскихСутках

где Дата1 — начало периода, Дата2 — конец периода.
(Ну описание для переменной можешь придумать посерьезней) 🙂

Здесь немного другая ситуация. Смотрите например у нас 2 даты:
02.05.2012 20:00:00 и 03.05.2012 20:10:00

Получается что второго числа человек отработал 4 часа а третьего 20 часов в сумме должено получиться 24 часа, а в отчете пишет 20, т.к. 24 принимает за 20. Должно идти сокращение до 20 часов, если это сутки. Т.е. если человек отработал бы 3.05.2012 23 часа, должно взяться 20 часов.

(5) Zircool,
От блин! Что ж ты как пользователь!?
Нужную вводную информацию по частям выдаешь?
Надо было сразу описание задачи написать. (полностью)

Алгоритм описанный выше (для запроса) имеет только одну маленькую погрешность.

Расчет именно того самого «хвостика».
Т.е. когда сутки были полные. тут и гадать не стоит берем за аксиому что когда полные сутки то 24-4 = 20 часов.
А вот если тот самый преславутый «хвостик» те самые последние часы последних суток.
Тут нужно добавить следующее:
Если «хвостик» по часам меньше 20, то оставляем как есть, а если больше то вместо него ставим 20 часов.

Сначала считаем количество полных суток:

ВторойДень = НачалоДня(Дата1)+ 86400.

ХвостикВНачале = (ВторойДень — Дата1)/3600;
ХвостикВКонце = (Дата2-НачалоДня(Дата2))/3600;

(округляй либо конечный результат, либо промежуточный)

(8) brunhilda,
Если для данной задачи. Точкой перевала суток будет время именно 00:00
То твой алгоритм правильней чем мой.

Если точкой перевала суток считать время в составе первой даты(начало периода), то достаточно моего.

Но по уму, твой алгоритм правильней.
Сутки все таки начинаются с 00:00 и поэтому всегда будет «предхвостик» в начале перед следующими полными сутками.
Но если у них в сутках 20 часов, то фиг его знает с какого времени у них сутки начинаются 🙂

При твоих условиях и в запросе это будет выглядеть так:

РАЗНОСТЬДАТ(Дата1, Дата2, ДЕНЬ) * 20 +
ВЫБОР
КОГДА РАЗНОСТЬДАТ(Дата1, Дата2, ЧАС) — РАЗНОСТЬДАТ(ПоступлениеТоваров.Дата, &Дата1, ДЕНЬ) * 24 > 20 ТОГДА 20
ИНАЧЕ РАЗНОСТЬДАТ(Дата1, Дата2, ЧАС) — РАЗНОСТЬДАТ(ПоступлениеТоваров.Дата, &Дата1, ДЕНЬ) * 24
КОНЕЦ
КАК ЧасыВМарсианскихСутках

Ребят спасибо за помощь, в датах у меня большой пробел)))

Использовал алгоритм от brunhilda. С следующими датами неправильно ведет рассчет.

02.05.2012 8:00:00 | 02.05.2012 20:00:00 | 16,00

Дата1 = Выборка.ДатаВыезда;
Дата2 = Выборка.ДатаВозвращения;

Если НачалоДня(Дата1) = НачалоДня(Дата2) Тогда

Результат = (Выборка.ДатаВозвращения — Выборка.ДатаВыезда) /3600;
Если Результат > 20 Тогда
Результат = 20;
КонецЕсли;

ЗП = Результат * 77;

ВторойДень = НачалоДня(Дата1)+ 86400;
КоличествоСуток = (НачалоДня(Дата2)-ВторойДень)/86400;

ХвостикВНачале = (ВторойДень — Дата1)/3600;
ХвостикВКонце = (Дата2-НачалоДня(Дата2))/3600;

Результат = КоличествоСуток*20+ХвостикВначале+ХвостикВКонце;
ЗП = Результат * 77;

Ссылка на основную публикацию
Adblock
detector