Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  07:58[Войти] | [Зарегистрироваться]
Ответ на вопрос № 50989

12-04-2007 11:31
Доброе время суток!

Delphi 7.0, IB 6.0.

Просмотрел часть вопросов по дате, но похожего не нашел.

Делаю отчет. В таблице хранятся дата начала и дата окончания. Нужно по каждому клиенту посчитать общее количество времени проведенного в учреждении за заданный период (в иделале нужно чтоб сразу выдавало итог по каждому в формате ##,## где целое - часы, дробное - минуты). Можно ли как-то на сервере быстро на основании двух имеющихся дат вычислить общее количество часов и минут? Имеется в виду можно ли это сделать все силами IB без использования UDF и уж тем более без программной обработки.

Спасибо!

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

06-05-2007 11:04
Доброго времени суток!

В общем, я покопался, потерзал разработчиков FB, и получается следующее: поскольку в 3-м диалекте разность дат представляется как NUMERIC(18,9), а не DOUBLE PRECISION, получаем погрешность вычитания - до ~0.856*10^(-4) секунды. Т.е. при вычитании можем получить ошибку в 1 десятитысячную секунды. Поэтому результат нужно всегда округлять до наибольшего по модулю целого числа и все дальнейшие расчеты вести уже на основе него.

Как верно заметил Python, решается это все с помощью ХП (писал я, поэтому не исключены ошибки):

create procedure date_diff(DATE1 TIMESTAMP,DATE2 TIMESTAMP)
returns (DAYS INTEGER,HOURS INTEGER,MINUTES INTEGER,SECONDS INTEGER,
        MILLISECONDS INTEGER)
as
DECLARE VARIABLE TenThousands NUMERIC(18,9);
DECLARE VARIABLE Modulo BIGINT;
begin
  TenThousands = (DATE1-DATE2)*86400*10000;
  Modulo = case
        when (TenThousands>0) THEN CAST(TenThousands+0.5 as BIGINT)
        when (TenThousands<0) THEN CAST(TenThousands-0.5 as BIGINT)
        else CAST(TenThousands AS BIGINT)
  end;
  Milliseconds = Modulo-Modulo/10000*10000;
  Modulo = Modulo/10000;
  Seconds = Modulo-Modulo/60*60;
  Modulo = Modulo/60;
  Minutes = Modulo-Modulo/60*60;
  Modulo = Modulo/60;
  Hours = Modulo-Modulo/24*24;
  Modulo = Modulo/24;
  Days = Modulo;
  SUSPEND;
end

 
Процедура возвращает разложение DATE1-DATE2 (должна корректно работать с отрицательными датами). Естественно, работает только в 3-м диалекте, в FB 1.5 и выше

С уважением,

18-04-2007 15:24
Доброго времени суток!

To _nautilus_
В третьем выдает на минуту меньше.
Для диапазонов (28.04.2007 22:30:59,28.04.2007 22:59:58) (01.04.2007 23:59:59, 02.04.2007 01:00:00) возвращает корректный результат, как и в первом диалекте. У меня ерунда начинается, если есть дробные доли секунды. Похоже, в 3-м диалекте мой вариант использовать нельзя. Надо копать дальше.

С уважением,

17-04-2007 05:17 | Сообщение от автора вопроса
2Eugene

Да, Вы правы. На одних и тех же данных в первом диалекте Ваш запрос отрабатывает нормально. В третьем выдает на минуту меньше.

17-04-2007 03:12
Доброго времени суток!

To  _nautilus_
а то почему-то количество минут меньше на одну.
У Вас база в первом диалекте?
Пример данных с ошибкой привести можете?

С уважением,

17-04-2007 02:05 | Сообщение от автора вопроса
2Eugene

Большое спасибо!

Только, если не ошибаюсь, надо в конце подправить

(60*CAST((end_date-start_date)*24-0.5 AS INTEGER)-1) as Minutes


а то почему-то количество минут меньше на одну.

15-04-2007 14:09
Доброго времени суток!

В первом диалекте число часов и минут можно получить следующим запросом

select start_date,end_date,
      CAST((end_date-start_date)*24-0.5 AS INTEGER) as Hours,
      CAST((end_date-start_date)*60*24-0.5 AS INTEGER)-
      60*CAST((end_date-start_date)*24-0.5 AS INTEGER) as Minutes
from table_dates



Форматирование результата лучше сделать на клиенте

С уважением,

15-04-2007 06:23
>>> без использования UDF
Конечно. Есть же стандартный подход - ханимые процедуры.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Какой месяц идет после марта?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования