【问题标题】:Getting all records before a particular month and year获取特定月份和年份之前的所有记录
【发布时间】:2017-02-24 18:55:20
【问题描述】:

我有一个包含单独月份和年份字段的表 - 我需要查询此表以仅获取过去某个月份和年份之前的记录,这些记录会定期更改。 (为了清楚起见,我将日期硬编码为 2016 年 11 月)

DECLARE @Month INT
DECLARE @Year INT

SET @Month = 11
SET @Year = 2016

SELECT * FROM Items 
WHERE [Month] <= @Month AND [Year] <= @Year

这没有得到我想要的结果,因为由于月份标准,2016 年 12 月之前的项目永远不会被提取。

我尝试通过连接月份和年份字段来解决此问题:

SET @YearMonth = 201611

SELECT * FROM Items 
WHERE cast([Year] as nvarchar(4)) + cast([Month] as nvarchar(2)) <= @YearMonth

但这会在 2017 年返回项目。(不知道为什么?)

上述查询是否可以修复,或者是否有更好的方法来获得所需的结果?

【问题讨论】:

  • 如何(年 * 100 + 月)

标签: sql-server


【解决方案1】:

SELECT * FROM Items WHERE [Year] < @Year OR ([Year] = @Year AND [Month] <= @Month)

翻译:

  1. 从我选择的年份之前获取所有条记录
  2. 仅从选定月份或之前获取选定年份本身的那些。

【讨论】:

    【解决方案2】:

    在您的最后一个查询中,您将获得 2017 年的记录,因为 20171 201711。因此,要修复您的查询,您必须执行类似

    的操作
    cast([Year] as nvarchar(4)) + right('00' + [Month], 2) <= @YearMonth
    

    最好将日期存储为date(time),而不是单独的属性中的年、月和日。

    【讨论】:

    • 我同意你最后的说法,他们应该使用date 数据类型。
    • 我同意,不幸的是这是我继承的数据,并且该表不包含任何日期数据。
    • @finjo - 我会在表中添加一个新的计算字段,它会根据月份和年份创建一个日期。只需将日期设置为 1。
    【解决方案3】:

    试试这个,

    select  * from Items 
    where convert(date,concat([Year],'-',[Month],'-','01')) > 
    convert(date,concat(@Year,'-',@Month,'-','01'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      相关资源
      最近更新 更多