Не получается ожидаемое значение при выполнении расчета по переменным на основе даты - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь получить десятичное значение DaysRemainingInMonth / DaysInMonth в операторе SELECT, однако я всегда получаю значение 0 в столбце при выполнении оператора.

Это кажется таким странным, поскольку по сути это простое упражнение с разделением:

declare @DaysinMonth int = DAY(EOMONTH(GETDATE())) -- 31
declare @DaysRemaining int = @DaysinMonth - DAY(GETDATE()) -- 24

SELECT 
      (DAY(EOMONTH(GETDATE())) - DAY(GETDATE())) as DaysRemaining
      ,@DaysinMonth as DaysinMonth 
      ,@DaysRemaining as DaysRemaining2
      , cast( (24/31) as decimal(18,10)) as Col1 -- Try casting and hard-coded values??
      , @DaysRemaining / @DaysinMonth as col2
      , 10 / 2 as WorkingExample

Конечно, я должен получить 0.774194... как ответ на Col1, по крайней мере? Я что-то упускаю из виду?

Ответы [ 3 ]

1 голос
/ 07 мая 2019

Попробуйте привести оба значения к числовому

declare @DaysinMonth int = DAY(EOMONTH(GETDATE())) -- 31
declare @DaysRemaining int = @DaysinMonth - DAY(GETDATE()) -- 24

SELECT 
      (DAY(EOMONTH(GETDATE())) - DAY(GETDATE())) as DaysRemaining
      ,@DaysinMonth as DaysinMonth 
      ,@DaysRemaining as DaysRemaining2
      , cast( (24/31) as decimal(18,10)) as Col1 -- Try casting and hard-coded values??
      , cast(@DaysRemaining as numeric) / cast(@DaysinMonth as numeric) as col2
      , 10 / 2 as WorkingExample
1 голос
/ 07 мая 2019

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

Вы можете попробовать использовать следующий код(снова с неявным преобразованием типов данных, сделанным сервером):

declare @DaysinMonth int = DAY(EOMONTH(GETDATE())) -- 31
declare @DaysRemaining int = @DaysinMonth - DAY(GETDATE()) -- 24

SELECT 
    (DAY(EOMONTH(GETDATE())) - DAY(GETDATE())) as DaysRemaining,
    @DaysinMonth as DaysinMonth,
    @DaysRemaining as DaysRemaining2, 
    (1.0 * 24 / 31) as Col1,
    1.0 * @DaysRemaining / @DaysinMonth as col2,
    10 / 2 as WorkingExample

Или используйте явное преобразование типов данных:

declare @DaysinMonth int = DAY(EOMONTH(GETDATE())) -- 31
declare @DaysRemaining int = @DaysinMonth - DAY(GETDATE()) -- 24

SELECT 
    (DAY(EOMONTH(GETDATE())) - DAY(GETDATE())) as DaysRemaining,
    @DaysinMonth as DaysinMonth,
    @DaysRemaining as DaysRemaining2, 
    CONVERT(decimal, 24) / 31  as Col1,
    CONVERT(decimal, @DaysRemaining) / @DaysinMonth as col2,
    10 / 2 as WorkingExample

Вывод:

DaysRemaining   DaysinMonth DaysRemaining2  Col1     col2           WorkingExample
24              31          24              0.774193 0.77419354838  5
1 голос
/ 07 мая 2019

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

Конвертировать один (или все) из операндов в decimal, так что результатом также будет decimal.

...
, convert(decimal, 24) / 31 as Col1
, convert(decimal, @DaysRemaining) / @DaysinMonth as col2
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...