格式功能无法在where子句中过滤格式日期?

时间:2019-03-29 10:11:28

标签: sql-server tsql datetime-format

获取当年和上一年的月份列表

  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')

1 个答案:

答案 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(!)甚至存储为日期)会更好。