获取当年和上一年的月份列表
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
ExpectedOutPut: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')
答案 0 :(得分:3)
看到您基本上将月/年存储为文本,将它们与日期进行实际比较充其量是痛苦的。您会更好地将实际日期或年/月存储为两个单独的值,也许还有文本版本用于显示?
无论如何,根据您不良的数据模型,您可以执行此操作以获取所需的内容:
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());
但是请注意,这现在对您的区域格式产生了依赖性,因为在美国(例如)日复一日的情况下这是不起作用的。使用YYYYMMDD的ANSI日期格式(或者将日期存储为年/月,或者将hey(!)甚至存储为日期)会更好。