powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / округление чисел при работе с данными
12 сообщений из 12, страница 1 из 1
округление чисел при работе с данными
    #39771071
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут кто-то опять на грабли наступил, взял дату-время сохранённые как double (как это часто делают Excel, Delphi), прибавил к дате.... И получил дату гуляющую на день вперёд-назад.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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 дробная часть не учитывалась?
...
Рейтинг: 0 / 0
округление чисел при работе с данными
    #39771074
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До кучи

Код: sql
1.
2.
3.
4.
5.
6.
7.
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 округляем вниз.
Некузяво.
...
Рейтинг: 0 / 0
округление чисел при работе с данными
    #39771075
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch
Код: sql
1.
  cast(floor( 41516.514479 ) + timestamp '1899-12-30' as DATE)  -- Здесь: 30.08.2013 а вовсе не 31.08.2013 !!!!



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

Код: sql
1.
cast(41516.514479 + timestamp '1899-12-30' as DATE) -- Здесь: 30.08.2013 а вовсе не 31.08.2013 !!!!
...
Рейтинг: 0 / 0
округление чисел при работе с данными
    #39771077
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дельфийская дата не тождественна интербейсовской дате.
дальше можно не читать.

зы: в доке к 3-ке, кстати, есть пассаж по поводу внутренностей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
округление чисел при работе с данными
    #39771084
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

то что float можно прибавлять к дате всего лишь особенность реализации. Никаких сложений дат с числами в стандарте нет. Там для этого специальный тип предусмотрен INTERVAL
...
Рейтинг: 0 / 0
округление чисел при работе с данными
    #39771167
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисНикаких сложений дат с числами в стандарте нет.

это хорошо, значит можно поменят ьэту реализацию
...
Рейтинг: 0 / 0
округление чисел при работе с данными
    #39771171
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
08.02.2019 15:27, Arioch пишет:
> это хорошо, значит можно поменят ьэту реализацию

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

(С) - Козлевич Адам Казимирович
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
округление чисел при работе с данными
    #39771185
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

это обозначает что ты своё недопонимание за баг принимаешь, только и всего
...
Рейтинг: 0 / 0
округление чисел при работе с данными
    #39771187
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
раз нет стандарта - то это не баг, это грабли

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

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

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

...вообще при переходе от 1.5 к 2.0 куда более радикальные изменения делали
...
Рейтинг: 0 / 0
округление чисел при работе с данными
    #39771197
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
08.02.2019 15:55, Arioch пишет:
> а ты в реальном коде заложился именно на такое округление float+date
> и при его изменении у тебя всю сломается?

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

к тому же, ты ожидаешь, что контрабас звучит так же как скрипка,
на одних и тех же нотах партитуры.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
округление чисел при работе с данными
    #39771199
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

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

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

Код: sql
1.
2.
SELECT current_timestamp + INTERVAL 1 DAY as new_date 
FROM rdb$database



кстати эти интервальные штуки были бы крайне полезны с фреймами оконных функция в 4.0
...
Рейтинг: 0 / 0
округление чисел при работе с данными
    #39771214
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

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

Ибо зачем понижать градус точность?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / округление чисел при работе с данными
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]