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

Откуда:
Сообщений: 22
Добрый день!
Внезапно перестали работать подобные вычисления SQL Server:
declare @date date = '20210527';
select @date + 1

Знаю что можно делать так:
declare @date date = '20210527';
select dateadd(day, 1, @date)

или выполнять подобную операцию с DATETIME, но почему пропала возможность работать таким образом с DATE? В чем может быть причина?
Версия сервера: Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) Aug 22 2017 17:04:49 Copyright (C) 2017 Microsoft Corporation Standard Edition (64-bit) on Windows Server 2016 Datacenter 10.0 <X64> (Build 14393: ) (Hypervisor)

Сообщение было отредактировано: 27 май 21, 09:27
27 май 21, 09:29    [22327805]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3041
ol_chig
Добрый день!
Внезапно перестали работать подобные вычисления SQL Server:
declare @date date = '20210527';
select @date + 1

Знаю что можно делать так:
declare @date date = '20210527';
select dateadd(day, 1, @date)

или выполнять подобную операцию с DATETIME, но почему пропала возможность работать таким образом с DATE? В чем может быть причина?
Версия сервера: Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) Aug 22 2017 17:04:49 Copyright (C) 2017 Microsoft Corporation Standard Edition (64-bit) on Windows Server 2016 Datacenter 10.0 <X64> (Build 14393: ) (Hypervisor)

так решил мелкософт
27 май 21, 09:57    [22327813]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
andy st
Member

Откуда:
Сообщений: 820
ol_chig,
а +1 к типу данных date вообще работал когда-нибудь?
к datetime - запросто
27 май 21, 10:02    [22327817]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8690
andy st,

select @date + 1 это выражение, основанное на предположении типа переменной и особенностей поведения интерпретатора. Необходимо всегда использовать dateadd().
27 май 21, 10:20    [22327825]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
aleks222
Member

Откуда:
Сообщений: 1414
andy st
ol_chig,
а +1 к типу данных date вообще работал когда-нибудь?
к datetime - запросто

Никогда к date нельзя было добавлять целые.

Только к Datetime. Да и то deprecated со времени MS SQL 2000.
27 май 21, 10:31    [22327829]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
Кесарь
Member

Откуда:
Сообщений: 651
Перестал работать и очень хорошо. Синтаксический сахар, приводящий к нестабильности кода, есть зло.
27 май 21, 11:02    [22327840]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
uaggster
Member

Откуда:
Сообщений: 1030
andy st
ol_chig,
а +1 к типу данных date вообще работал когда-нибудь?
к datetime - запросто

Я, например, не знал, что оно и к datetime то работает :-)
27 май 21, 13:11    [22327934]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
baracs
Member

Откуда: Москва
Сообщений: 7215
uaggster
andy st
ol_chig,
а +1 к типу данных date вообще работал когда-нибудь?
к datetime - запросто

Я, например, не знал, что оно и к datetime то работает :-)
Повезло.
А я задолбался вычищать эту "арифметику" из старых ХП.
27 май 21, 13:20    [22327936]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8690
Первое же, что надо сделать - вычистить код от подобных конструкций и запретить их применять внутренними распоряжениями. Вообще всё, что depricated или "будет удалено в будущих версиях".
27 май 21, 13:25    [22327938]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
ol_chig
Member

Откуда:
Сообщений: 22
andy st
ol_chig,
а +1 к типу данных date вообще работал когда-нибудь?

Вот именно что работал!)
И почему все считают что это "мусорный код", если к datetime это применимо? прибавление числа к datetime приводит увеличение этой даты на N дней, почему нельзя так же считать date, если программа понимает целое число как целый день, а не часы\минуты\секунды.

Сообщение было отредактировано: 27 май 21, 14:21
27 май 21, 14:28    [22327993]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
msLex
Member

Откуда:
Сообщений: 9022
ol_chig
И почему все считают что это "мусорный код"


Как вам уже сказали, потому что это depricated поведение.
Использование depricated фич чревато "внезапно" проявляющимися ошибками при переходе на следующую версию SQL Server-а

Сообщение было отредактировано: 27 май 21, 14:26
27 май 21, 14:34    [22327997]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
aleks222
Member

Откуда:
Сообщений: 1414
ol_chig

Вот именно что работал!

Не врите. Лечите дежавю.
Date появился в MS SQL 2008 и никогда не допускалось date +1.

ol_chig

И почему все считают что это "мусорный код", если к datetime это применимо? прибавление числа к datetime приводит увеличение этой даты на N дней, почему нельзя так же считать date, если программа понимает целое число как целый день, а не часы\минуты\секунды.

Патаму, что разработчики языков мечутся из крайности в крайность.
То "синтаксический сахар" добавляют до угрозы диабета, то заменители "сахара" внедряют.

Deprecated эта фича уже давно.
И не уберут ее, покуда жив datetime.

Что касаемо "православно ли это, али подлежит анафеме" - на C# поглядите, уже сахарница не выдерживает.

Сообщение было отредактировано: 27 май 21, 14:40
27 май 21, 14:45    [22328011]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
ol_chig
Member

Откуда:
Сообщений: 22
aleks222,

возможно у меня и правда глюки, раз столько человек говорят об одном и том же... Тогда ладно, буду считать что этот date+1 появился в коде сам по себе, заменив прошлый datetime+1. И начались ошибки.
27 май 21, 15:27    [22328057]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
Wlr-l
Member

Откуда:
Сообщений: 563
ol_chig

И почему все считают что это "мусорный код", если к datetime это применимо? прибавление числа к datetime приводит увеличение этой даты на N дней, почему нельзя так же считать date, если программа понимает целое число как целый день, а не часы\минуты\секунды.


Все очень просто:

datetime это синоним float, т.е. числа с плавающей точкой, где целая часть — это количество дней, прошедших от базовой даты. Прибавление 1 приводит к получению следующей даты. Но прибавить месяц вот так просто уже не получится.

Date занимает 3 байта, а целое число - 4 байта. Выражение date+1 предполагает, что date преобразуется к целому числу, к этому числу прибавляется 1 и полученный результат преобразуется к date. Как на самом деле происходит обработка этих 3 байт для получения следующей даты нам не рассказывают. Поэтому приведение типа данных date к типу данных integer запрещено.

И правильно делают. Есть интерфейс, функции работы с датами, и его нужно использовать, так как реализация может измениться в очередной версии продукта.
27 май 21, 15:32    [22328060]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31906
ol_chig
буду считать что этот date+1 появился в коде сам по себе, заменив прошлый datetime+1.
date+1 мог появиться в коде, когда поле/переменная были datetime
Вы же проект храните в базе сорсов с версионностью? Посмотрите, что там было, с этим кодом и моделью данных, кто чего когда менял.
27 май 21, 20:18    [22328202]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
ol_chig
Member

Откуда:
Сообщений: 22
Спасибо за разъяснения!
28 май 21, 06:41    [22328292]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
L_argo
Member

Откуда:
Сообщений: 1473
datetime2 тоже не работает с +1. :(
28 май 21, 09:24    [22328327]     Ответить | Цитировать Сообщить модератору
 Re: Почему DATE + 1 перестал работать  [new]
Wlr-l
Member

Откуда:
Сообщений: 563
L_argo
datetime2 тоже не работает с +1. :(


Гадать и удивляться тому, что можно и что нельзя делать с типами данных, как и перебирать варианты не нужно. Все "украдено" до нас:

https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/data-type-conversion-database-engine?view=sql-server-ver15

Согласно концепции типов данных каждая переменная относится к одному и только одному типу данных. Тип данных определяет a) область допустимых значений переменных этого типа и b) набор операций, которые можно применять к переменным этого типа. К сожалению, в разделе о типах ( https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-ver15 ) пункт b не упоминается. Но по ссылкам можно добраться и до операций.
31 май 21, 15:40    [22329395]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить