过去 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 个月的数据的主要内容,如果未能解决你的问题,请参考以下文章