Программы "Простой софт" www.prostoysoft.ru

ВНИМАНИЕ! РЕКЛАМНЫЕ СООБЩЕНИЯ И ГИПЕРССЫЛКИ В ФОРУМЕ ЗАПРЕЩЕНЫ (посты удаляются автоматически часто с пользователем)
Текущее время: 06.07.2022 23:32

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 29.01.2020 11:20 
Не в сети

Зарегистрирован: 19.09.2012 13:43
Сообщения: 23
ДОбрый день,

Столкнулся с такой проблемой.
Необходимо посчитать и записать в

Новое поле (Field1) = Конец выполнения (EndDate) - Начало выполнения (StartDate)

Все поля имеют тип - Дата и время
Во время выполнения триггера даты переделываются в числовые переменные. скриншоты прикрепил.
Как правильно решить такую задачу?


Вложения:
Screenshot 2020-01-29 at 14.12.47.png
Screenshot 2020-01-29 at 14.12.47.png [ 116.94 КБ | Просмотров: 34542 ]
Screenshot 2020-01-29 at 14.13.28.png
Screenshot 2020-01-29 at 14.13.28.png [ 133.88 КБ | Просмотров: 34542 ]
Screenshot 2020-01-29 at 14.13.40.png
Screenshot 2020-01-29 at 14.13.40.png [ 138.82 КБ | Просмотров: 34542 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29.01.2020 11:54 
Не в сети

Зарегистрирован: 15.03.2016 07:21
Сообщения: 96
Откуда: г. Хабаровск
Триггер здесь не нужен. Нужно добавить вычисляемое поле
Код:
SELECT w.*, (ROUND((w.EndDate - w.StartDate) * 1440, 0)) AS DurationCalc FROM tblWorks AS w


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29.01.2020 13:55 
Не в сети

Зарегистрирован: 19.09.2012 13:43
Сообщения: 23
Тоже ругается на то что implicit на int меняется и предлагает CONVERT использовать как в триггере.

Обычную функцию когда в вычисление я записывал EndDate - StartDate то тоже так было


Вложения:
Screenshot 2020-01-29 at 16.49.02.png
Screenshot 2020-01-29 at 16.49.02.png [ 253.39 КБ | Просмотров: 34532 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29.01.2020 15:31 
Не в сети

Зарегистрирован: 15.03.2016 07:21
Сообщения: 96
Откуда: г. Хабаровск
Я написал запрос на создание представления, а не формулу для создания поля.
Если Вы создаёте новое поле в конструкторе, то в поле "Формула" нужно написать:
Код:
ROUND((EndDate - StartDate) * 1440, 0)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29.01.2020 15:50 
Не в сети

Зарегистрирован: 19.09.2012 13:43
Сообщения: 23
Так не получается. Такую ошибку получал тоже , когда просто формулу писал


Вложения:
Screenshot 2020-01-29 at 18.42.00.png
Screenshot 2020-01-29 at 18.42.00.png [ 72.62 КБ | Просмотров: 34527 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29.01.2020 16:45 
Не в сети

Зарегистрирован: 15.03.2016 07:21
Сообщения: 96
Откуда: г. Хабаровск
В Вашем случае имена полей нужно дополнить названиями таблиц:
Код:
ROUND((tblWorks.EndDate - tblWorks.StartDate) * 1440, 0)
Никакие преобразования в целое делать не нужно. Минуты - это дробная часть даты.
В поле "Формула" нужно вписать приведённый здесь код.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29.01.2020 18:14 
Не в сети

Зарегистрирован: 19.09.2012 13:43
Сообщения: 23
Записал точно как вы привели в прошлом посте.

Функция неправильно сработала, я зашел внутрь поля и там уже вот такая запись.
Иправления в нее не вносятся. То есть я записываю, сохраняю, а потом обратно когда в нее захожу, то опять уже исправленную формулу вижу.


Вложения:
Screenshot 2020-01-29 at 21.12.45.png
Screenshot 2020-01-29 at 21.12.45.png [ 257.3 КБ | Просмотров: 34514 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29.01.2020 21:00 
Не в сети

Зарегистрирован: 06.10.2014 18:30
Сообщения: 281
Откуда: Орел
В SQL так должно работать.
DATEDIFF(minute, LastLoginTime, LastLogoutTime)


Вложения:
Безымянный.jpg
Безымянный.jpg [ 111.01 КБ | Просмотров: 34500 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30.01.2020 03:59 
Не в сети

Зарегистрирован: 15.03.2016 07:21
Сообщения: 96
Откуда: г. Хабаровск
Romkan писал(а):
я записываю, сохраняю, а потом обратно когда в нее захожу, то опять уже исправленную формулу вижу.
Зачем конструктор полей правит формулу - это вопрос разработчикам.
Возможно, чтобы помочь администраторам - не имеющим опыта программирования.
Конструктором поля не создаю, поэтому с такими явлениями не стакивался.
Всегда модифицирую SQL-запрос: в свойствах таблицы кнопка "SQL" в правом верхнем углу формы.
Попробуйте и Вы. Для Вас запрос будет такой:
Код:
SELECT w.*, (ROUND((w.EndDate - w.StartDate) * 1440, 0)) AS DurationCalc, s.Service AS ServiceCalc, s.QuantRelation AS QuantRelationCalc, o.DetailCount AS DetailCountCalc FROM (tblWorks AS w LEFT JOIN tblServices AS s ON w.ServiceID = s.ID) LEFT JOIN tblOrders AS o ON w.OrderID = o.ID
Только проверьте имена полей - срисовывал их с Вашей картинки.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30.01.2020 08:11 
Не в сети

Зарегистрирован: 19.09.2012 13:43
Сообщения: 23
Всем спасибо большое за помощь.
Все правильно сработало только в случае такой записи.

Код:
DATEDIFF(minute, tblWorks.StartDate, tblWorks.EndDate)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30.01.2020 12:55 
Не в сети

Зарегистрирован: 15.03.2016 07:21
Сообщения: 96
Откуда: г. Хабаровск
Uspenskiy писал(а):
В SQL так должно работать.
DATEDIFF(minute, LastLoginTime, LastLogoutTime)
В Access так не работает. Когда то давно пытался использовать DATEDIFF('minute', StartTime, EndTime) - не получилось. Нашёл приведённое выше решение. Должно работать на любой платформе.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30.01.2020 13:34 
Не в сети
Администратор

Зарегистрирован: 15.02.2006 20:16
Сообщения: 3851
Откуда: Санкт-Петербург
В AccessSQL должно работать так
Код:
DATEDIFF('n', LastLoginTime, LastLogoutTime)

_________________
2B OR NOT 2B = TRUE


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30.01.2020 13:57 
Не в сети

Зарегистрирован: 15.03.2016 07:21
Сообщения: 96
Откуда: г. Хабаровск
Ivan писал(а):
В AccessSQL должно работать так
DATEDIFF('n', LastLoginTime, LastLogoutTime)
Работает!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30.01.2020 18:32 
Не в сети

Зарегистрирован: 06.10.2014 18:30
Сообщения: 281
Откуда: Орел
SQL. 10 000 000 циклов
Код:
SET @EndDate = @StartDate
SET @i = 10000000
SET @StartDate = GETDATE()

WHILE @i > 0
  BEGIN
  SET @Diff = ROUND((CONVERT(int, @EndDate) - CONVERT(int, @StartDate)) * 1440, 0) -- тут различие в циклах
  SET @i = @i-1
  END

SET @EndDate = GETDATE()
SELECT DATEDIFF(second, @StartDate, @EndDate)


выполняется за 9 секунд

Код:
SET @EndDate = @StartDate
SET @i = 10000000
SET @StartDate = GETDATE()

WHILE @i > 0
  BEGIN
  SET @Diff = DATEDIFF(minute, @StartDate, @EndDate) -- тут различие в циклах
  SET @i = @i-1
  END

SET @EndDate = GETDATE()
SELECT DATEDIFF(second, @StartDate, @EndDate)

выполняется за 6 секунд


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 31.01.2020 03:52 
Не в сети

Зарегистрирован: 15.03.2016 07:21
Сообщения: 96
Откуда: г. Хабаровск
Uspenskiy писал(а):
SET @Diff = ROUND((CONVERT(int, @EndDate) - CONVERT(int, @StartDate)) * 1440, 0)
А зачем здесь (CONVERT(int, @EndDate)? Если дату/время преобразовать в целое, то минуты не получите - время хранится в дробной части даты. Вы усложнили формулу ненужными вычислениями. У меня в Access'е таблица qdfWorks с этой формулой, содержащая 27000 записей, открывается мгновенно, при этом БД находится на другом компьютере.
Попробуйте убрать CONVERT и повторить эксперимент.
Uspenskiy писал(а):
SELECT DATEDIFF(second, @StartDate, @EndDate)
В MS SQL должен быть аргумент millisecond, с ним результат будет нагляднее


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB