Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 округление чисел при работе с данными  [new]
Arioch
Member

Откуда:
Сообщений: 10630
Тут кто-то опять на грабли наступил, взял дату-время сохранённые как double (как это часто делают Excel, Delphi), прибавил к дате.... И получил дату гуляющую на день вперёд-назад.

https://stackoverflow.com/questions/54574918/how-to-convert-double-precision-column-to-date-correctly/54588452#54588452

select
  41516.514479,
  cast( 41516.514479 as integer),
  round( 41516.514479 ),
  41516.514479 + DATE '1899-12-30',           -- Здесь: 31.08.2013 
  floor( 41516.514479 ),
  floor( 41516.514479 ) + DATE '1899-12-30'   -- Здесь: 30.08.2013 
from rdb$database


Эта грабля, она жёстко прошита в SQL-стандарте ?

Или можно сделать, чтобы при добавлении float к date дробная часть не учитывалась?
8 фев 19, 13:13    [21804281]     Ответить | Цитировать Сообщить модератору
 Re: округление чисел при работе с данными  [new]
Arioch
Member

Откуда:
Сообщений: 10630
До кучи

select
  41516.514479,
  41516.514479 + DATE '1899-12-30',           -- Здесь: 31.08.2013
  floor( 41516.514479 ) + DATE '1899-12-30',  -- Здесь: 30.08.2013
  41516.514479 + timestamp '1899-12-30',      -- Здесь: 12:20 30.08.2013
  cast(floor( 41516.514479 ) + timestamp '1899-12-30' as DATE)  -- Здесь: 30.08.2013 а вовсе не 31.08.2013 !!!!
from rdb$database


Получается, что DATE округляем вверх, а TIMESTAMP округляем вниз.
Некузяво.
8 фев 19, 13:17    [21804287]     Ответить | Цитировать Сообщить модератору
 Re: округление чисел при работе с данными  [new]
Arioch
Member

Откуда:
Сообщений: 10630
Arioch
  cast(floor( 41516.514479 ) + timestamp '1899-12-30' as DATE)  -- Здесь: 30.08.2013 а вовсе не 31.08.2013 !!!!


Тут очепятка, тут floor нету

cast(41516.514479 + timestamp '1899-12-30' as DATE) -- Здесь: 30.08.2013 а вовсе не 31.08.2013 !!!!
8 фев 19, 13:19    [21804288]     Ответить | Цитировать Сообщить модератору
 Re: округление чисел при работе с данными  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29642

дельфийская дата не тождественна интербейсовской дате.
дальше можно не читать.

зы: в доке к 3-ке, кстати, есть пассаж по поводу внутренностей.

Posted via ActualForum NNTP Server 1.5

8 фев 19, 13:25    [21804293]     Ответить | Цитировать Сообщить модератору
 Re: округление чисел при работе с данными  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9246
Arioch,

то что float можно прибавлять к дате всего лишь особенность реализации. Никаких сложений дат с числами в стандарте нет. Там для этого специальный тип предусмотрен INTERVAL
8 фев 19, 13:30    [21804303]     Ответить | Цитировать Сообщить модератору
 Re: округление чисел при работе с данными  [new]
Arioch
Member

Откуда:
Сообщений: 10630
Симонов Денис
Никаких сложений дат с числами в стандарте нет.


это хорошо, значит можно поменят ьэту реализацию
8 фев 19, 15:27    [21804477]     Ответить | Цитировать Сообщить модератору
 Re: округление чисел при работе с данными  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29642

08.02.2019 15:27, Arioch пишет:
> это хорошо, значит можно поменят ьэту реализацию

отойди от машины!

(С) - Козлевич Адам Казимирович

Posted via ActualForum NNTP Server 1.5

8 фев 19, 15:31    [21804489]     Ответить | Цитировать Сообщить модератору
 Re: округление чисел при работе с данными  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9246
Arioch,

это обозначает что ты своё недопонимание за баг принимаешь, только и всего
8 фев 19, 15:52    [21804516]     Ответить | Цитировать Сообщить модератору
 Re: округление чисел при работе с данными  [new]
Arioch
Member

Откуда:
Сообщений: 10630
раз нет стандарта - то это не баг, это грабли

и КАК это получается я понимаю и по ссылке расписал.
но от этого грабли не перестают быть граблями

Мимопроходящий
отойди от машины!


а ты в реальном коде заложился именно на такое округление float+date и при его изменении у тебя всю сломается?

...вообще при переходе от 1.5 к 2.0 куда более радикальные изменения делали
8 фев 19, 15:55    [21804519]     Ответить | Цитировать Сообщить модератору
 Re: округление чисел при работе с данными  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29642

08.02.2019 15:55, Arioch пишет:
> а ты в реальном коде заложился именно на такое округление float+date
> и при его изменении у тебя всю сломается?

я стараюсь не закладываться на любые "особенности реализации".
но я категорически против чтоб менять "неонки унутри"
из одного только "чувства прекрасного".

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

Posted via ActualForum NNTP Server 1.5

8 фев 19, 16:02    [21804534]     Ответить | Цитировать Сообщить модератору
 Re: округление чисел при работе с данными  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9246
Arioch,

в реальном коде уже давно пора использовать всякие там DATE_ADD, DATE_DIFF и вообще не закладываться на сложение с double.

А в стандарте как то вот так

SELECT current_timestamp + INTERVAL 1 DAY as new_date 
FROM rdb$database


кстати эти интервальные штуки были бы крайне полезны с фреймами оконных функция в 4.0
8 фев 19, 16:02    [21804537]     Ответить | Цитировать Сообщить модератору
 Re: округление чисел при работе с данными  [new]
pastor
Member

Откуда: Калуга
Сообщений: 962
Arioch,

я складываю даты исключительно с double ( :DATE_FROM + 0.5e0).

Ибо зачем понижать градус точность?
8 фев 19, 16:11    [21804560]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить