Функция форматирования не работает при условии, где фильтровать дату форматирования? - PullRequest
0 голосов
/ 29 марта 2019

Получение списка месяцев текущего и предыдущего года

  SELECT FORMAT(DATEADD(month,number,CAST(YEAR(DATEADD(YEAR,-1,GETDATE())) AS varchar(4)) + '-01-01'),'MMM') + '-' +
                   SUBSTRING(CAST(CAST(YEAR(GETDATE()) AS VARCHAR(4)) + IIF(number<12,-1,0) AS VARCHAR(4)),3,2) as Months into #temptable
            FROM master..spt_values
            WHERE type = 'P'
            AND number < 24

Ожидаемый результат: -1

From Current Month-                 Mar-19
                                    Feb-19
End of CurrentYear Month           -Jan-19

Ожидаемый выход: 2

Jan-18
to 
Dec -18

Я пытаюсь этот запрос

select *from #temptable where Months>=FORMAT(DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0),'MMM-yy') and Months<=FORMAT(DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0),'MMM-yy') 
select *from #temptable where Months>=FORMAT(DATEADD(yy, DATEDIFF(yy, 0, getdate())-1, 0),'MMM-yy') and Months<= FORMAT(DATEADD(yy, DATEDIFF(yy, 0, getdate()), -1),'MMM-yy')

1 Ответ

3 голосов
/ 29 марта 2019

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

В любом случае, основываясь на вашей плохой модели данных, вы могли бы сделать это, чтобы получитьчто вам нужно:

SELECT * FROM #temptable WHERE YEAR(CONVERT(DATE, '01-' + Months)) = YEAR(GETDATE()) - 1;
SELECT * FROM #temptable WHERE YEAR(CONVERT(DATE, '01-' + Months)) = YEAR(GETDATE()) AND MONTH(CONVERT(DATE, '01-' + Months)) <= MONTH(GETDATE());

Но учтите, что теперь это вводит зависимость от вашего регионального формата, так как это не будет работать в Америке (например), так как день за месяцем.Вам было бы намного лучше использовать формат даты ANSI в формате ГГГГММДД (или хранить даты в виде года / месяца, или хей (!) Даже в виде даты).

...