过去 13 个月的数据

Posted

技术标签:

【中文标题】过去 13 个月的数据【英文标题】:Data from last 13 months 【发布时间】:2014-04-28 11:42:19 【问题描述】:

我在 SQL Server 2008 数据库中有一个表,它有一个“月”列,nvarchar 数据类型,其中数据以“2013 年 1 月”、“2013 年 2 月”、“2013 年 3 月”等格式存储,直到'2014 年 3 月'。

现在我想要我的结果中从 2013 年 3 月到 2014 年 3 月的数据,但我无法得到。

我正在尝试这个 where 子句:WHERE (Month > DATEADD(Month, DATEDIFF(year, 0, GETDATE()) - 13, 0)) 但它给了我一个错误说 从字符串转换日期和/或时间时转换失败。

我还尝试将数据重命名为“2014 年 3 月”,随后也将其他条目重命名,但这也无济于事。

尊敬的 SQL 专家,请帮忙!

【问题讨论】:

"column 'Month',nvarchar 数据类型,其中数据以'Jan 2013"的格式存储 为什么不存储为datetime 或@987654322 @首先?这更便宜,更不容易出错,并且允许使用日期函数。您应该将其转换为显示它的字符串,所以在最后一个位置。这还有一个好处是您可以用不同的语言显示月份。 【参考方案1】:

你可以这样做

SELECT *
FROM table 
where (LEFT(month,3) not in ('jan','feb') and right(month,4)='2013')
OR (LEFT(month,3) in ('jan','feb') and right(month,4)='2014')

如果您想包括 2014 年 3 月,结果集将包括 2013 年 3 月,但不包括 2014 年 3 月,将 where 子句的最后一部分更改为 (LEFT(month,3) in ('jan','feb','mar') and right(month,4)='2014') 但我建议您将日期存储为日期时间

【讨论】:

感谢海丁! :) 它现在解决了我的目的。但是,假设我想让它滚动 13 个月呢?例如: 下个月我需要 2013 年 4 月到 2014 年 4 月的数据;我需要每隔一个月手动添加/删除内容吗?请指教。另外,我提出了将“月份”字段的设计和数据类型更改为日期时间的请求。 连续 13 个月我会使用像 Gordon Linoff 在其他回答这个问题的答案中推荐的东西,所以使用 where 子句,'where convert(date, '01' + [Month]) > DATEADD( Month, DATEDIFF(month, 0, GETDATE()) - 13, 0)´ where convert(date, '01 ' + [Month]) > DATEADD(Month, DATEDIFF(month, 0, GETDATE()) - 13, 0)【参考方案2】:

令人讨厌的日期格式。我的建议是将其转换为实际日期。令人高兴的是,SQL Server 可以识别以下格式:

select convert(date, '15 MAR 2014')

所以,你可以这样做:

where convert(date, '15 ' + [Month]) > DATEADD(Month, DATEDIFF(year, 0, GETDATE()) - 13, 0)

我随意将日期设置为月中。您可能想使用'01' 而不是'15'

【讨论】:

以上是关于过去 13 个月的数据的主要内容,如果未能解决你的问题,请参考以下文章

过去 13 个完整月的 SQL WHERE 子句

如何找到滚动的 3 个月方差?

使用图表显示过去 12 个月的注册用户分析

OpenERP(odoo)开发实例之搜索检索过去3个月的数据

oracle 中过去 12 个月的日期

如何为过去 3 个月的每个日期运行查询