2016-09-27 1 views
0

У меня есть столбец FLOAT SQL Server, который должен представлять будущую четверть:Убедитесь, что Десятичное значение в формате YYYY.Q

Delivery_Date (поплавок, нуль)

Хотя это не идеальный формат для представления даты я получаю данные в книге Excel и имею пакет SSIS для загрузки его в SQL Server. Это происходит от внешнего поставщика, так что это то, что есть.

Значения должны быть в формате YYYY.Q. Годовой квартал должен быть в будущем, поэтому, если мы находимся в третьем квартале 2016 года, значение 2016.3 неверно. Значения, которые имеют только год, а также не квартал, также неверны.

Каков наилучший способ сформулировать эту проверку?

+0

Надеюсь, это не домашнее задание, так как иначе ваш проф был бы действительно жестоким монстром. Почему бы не хранить Q3 2016 как 2016/07/01? – ajeh

ответ

2

А float действительно, действительно, действительно, действительно, действительно плохой способ выразить эти данные, так как поплавок является приблизительной представления десятичных чисел. В той степени, в которой у вас есть какой-либо контроль над структурой, вы должны изменить ее на decimal(5, 1) или какой-либо другой тип.

Вы можете получить текущую четверть в этой форме, используя:

select year(getdate()) + datepart(quarter, getdate())/10.0 

Проблема заключается в том, что небольшая разница округление может означать, что следующий не работает, как ожидалось:

where Delivery_Date <= year(getdate()) + datepart(quarter, getdate())/10.0 

Дата поставки может быть 2016.30000000001, а вторая часть может вернуться 2016.299999997. Они оба смотрят как «2016.3», но они не равны.

Я полагаю, вы можете добавить немного дельты, чтобы сделать его работу:

where Delivery_Date <= 0.01 + year(getdate()) + datepart(quarter, getdate())/10.0 

Но использование float неуместного опасно.

+0

Я согласен, что десятичное число лучше, чем float, но было бы лучше иметь отдельные столбцы для производительности запросов. Я ненавижу синтаксический анализ данных в моих запросах =/ – ps2goat

+0

К сожалению, у меня нет контроля над типом столбца. – Buggieboy

+0

Ваш 2016.3 может храниться как 2016.299999999 в столбце 'float'. Что ты собираешься делать? – ajeh

Смежные вопросы