【问题标题】:Return records less than date返回小于日期的记录
【发布时间】:2018-01-18 23:51:33
【问题描述】:

我有一个表,其中 2 列分别称为 Month 和 Year,并且都是 INT。我需要返回所有小于提供日期的记录。

所以如果我传递以下参数@Month = 8@Year = 2017,我想返回2017 年8 月之前的所有记录。实现这一目标的最佳方法是什么?

SELECT * FROM testTable
WHERE year <= @Year AND
      month < @Month

是我当前的 SQL。如果我需要显示 2014 年 11 月的记录,这将不起作用

【问题讨论】:

  • 您可以添加case一个月的声明。仅在 year = @Year 时进行比较
  • 如果可能的话,你不应该像这样分隔日期部分。这意味着您将不得不不断地将它们重新组合成一个实际的日期。真正的问题是这意味着您的任何查询都不是 SARGable。以适当的数据类型存储数据将为您节省很多痛苦。
  • @SeanLange 我明白 100%。不幸的是,我没有设计数据库。我不明白为什么我们需要将日期存储在单独的列中。当我们需要向简单查询添加逻辑时,这会变得很困难。无论是在 SP 中还是在代码中。
  • 而且我知道有时我们会被其他人为我们继承的糟糕设计所困。也许您可以将计算列添加到表中?如果你让它持久化,你甚至可以索引它。如果可能的话,从性能的角度来看,这将是一种更好的方法。

标签: sql sql-server


【解决方案1】:

将它们作为日期进行比较。像这样:

SELECT * FROM testTable
WHERE  DATEFROMPARTS(year, month, 1) <= DATEFROMPARTS(@Year, @Month, 1)

【讨论】:

  • 这帮助了很多!太感谢了。我在 SQL 方面不是最好的,所以这对我很有帮助。
【解决方案2】:

将参数作为日期传递。喜欢

DECLARE @MyDate DATE = '08-01-2014'

现在你可以选择以下任何一个

SELECT
  *
  FROM YourTable
     WHERE CAST(ConCAT([Monnth],'-01-',[Year]) AS DATE) = @MyDate

或者

SELECT
   *
   FROM YourTable
      WHERE [Year] = YEAR(@MyDate)
            AND [Month] = MONTH(@MyDate)

【讨论】:

    【解决方案3】:

    可以使用 SQL Server 的 DATEPART 函数

     SELECT * FROM testTable
     WHERE YEAR<= DATEPART(yy,yourdate) AND
     MONTH < DATEPART(mm,yourdate)
    

    【讨论】:

      【解决方案4】:

      最好是转换数据类型再进一步查询。

          DECLARE @testtable TABLE (id INT identity(1, 1), name VARCHAR(100), year INT, month INT)
      
      INSERT INTO @testtable (name, year, month)
      SELECT 'me', '2014', 10
      
      UNION
      
      SELECT 'you', '2017', 08
      
      UNION
      
      SELECT 'us', '2015', 10
      
      UNION
      
      SELECT 'Him', '2017', 10
      
      UNION
      
      SELECT 'Her', '2018', 1
      
      SELECT *
      FROM @testtable
      WHERE CONCAT (year, '-', right('00' + cast(Month AS VARCHAR(2)), 2), '-', '01') 
      < = '2017-08-01'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-14
        • 2013-06-26
        相关资源
        最近更新 更多