Вести с полей

Сегодня начал писать новый код для адаптера EntityFrameworkCore. Попытался начать 🙂

Нужно соорудить транслятор System.DateTime.AddDays(double) в SQL.

Сначала надо посмотреть как Firebird переварит double значение:

… а переваривает он его не так как ожидалось 🙂


По-моему в IBProvider уже есть транслятор в DATEADD. Из какой-то ODBC-функции.

И сдается мне, в тот раз (это было 11 лет назад) мы прошляпили эту засаду с округлением.

4 комментария

hvlad  on Ноябрь 9th, 2018

Ты удивлён, что кол-во дней приводится к целому ?
А кто-то где-то обещал другое ?
Посмотри как в MSSQL работает DATEADD.

Или я не так понял твою печаль ? 😉

hvlad  on Ноябрь 9th, 2018

Кстати, для того, чтобы показать запрос и результат — не нужно снимать видео. Это, как минимум, не даёт скопировать запрос и повторить, не показывает всей нужной инф-ции на одном экране (нужно постоянно листать видео).
Такое вот мнение.

Dmitry Kovalenko  on Ноябрь 9th, 2018

Привет.

System.DateTime.AddDays(double)

Parameters
value
Double
A number of whole and fractional days. The value parameter can be negative or positive.

Returns
DateTime
An object whose value is the sum of the date and time represented by this instance and the number of days represented by value.

Remarks
This method does not change the value of this DateTime. Instead, it returns a new DateTime whose value is the result of this operation.

The fractional part of value is the fractional part of a day. For example, 4.5 is equivalent to 4 days, 12 hours, 0 minutes, 0 seconds, 0 milliseconds, and 0 ticks.


Печали нет. Наоборот 🙂

FirebirdSql.EntityFrameworkCore.Firebird.BLA-BLA-BLA.FbDateAddTranslator

Исходя из текущего поведения сервера, AddDays нужно конвертировать в что-то типа:

DATEADD(MILLISECOND,86400000*CAST(1.5 AS DOUBLE PRECISION),"r"."COL_TIMESTAMP")


Насчет видео. Это у меня появилась новая игрушка 🙂

Dmitry Kovalenko  on Ноябрь 9th, 2018

Насчет MSSQL, это ты точно заметил. Но они не округляют.

Запрос «select DATEADD(DAY, 1.6,CONVERT(datetime,’01.01.2000′))» возвращает «2000-01-02 00:00:00.000».

В своем EFCore провайдере они это тоже не учитывают 🙂


Чтобы два раза не вставать, посмотрел как себя ведет PG.

Запрос «select CAST(‘01.01.2000’ AS timestamp) + ‘1.5 day'» возвращает «2000-01-02 12:00:00».

Соответственно, его EFCore провайдер конвертирует AddDays корректно.

Leave a Comment