Sql 返回日期小于的记录

Sql 返回日期小于的记录,sql,sql-server,Sql,Sql Server,我有一个表,其中两列称为月和年,都是INT。我需要返回所有小于提供日期的记录 因此,如果我通过以下参数@Month=8和@Year=2017,我希望在2017年8月之前返回所有记录。实现这一目标的最佳方式是什么 SELECT * FROM testTable WHERE year <= @Year AND month < @Month 是我当前的SQL。如果我需要显示2014年11月的记录,这将不起作用。像 DECLARE @MyDate DATE = '08-01-2

我有一个表,其中两列称为月和年,都是INT。我需要返回所有小于提供日期的记录

因此,如果我通过以下参数@Month=8和@Year=2017,我希望在2017年8月之前返回所有记录。实现这一目标的最佳方式是什么

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

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

DECLARE @MyDate DATE = '08-01-2014'
现在你可以选择下面的任何一种

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


您可以使用SQL Server的DATEPART函数

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

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

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

最好转换数据类型并进一步查询

    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'

您可以为月份添加案例说明。仅当year=@YearIf时才进行比较。如果可能,您不应该像这样分隔日期部分。这意味着你必须不断地将它们重新组合到一个实际的约会中。真正的问题是,这意味着你的任何查询都不是可搜索的。以适当的数据类型存储数据将为您节省很多痛苦。@SeanLange我理解这是100%。不幸的是,我没有设计数据库。我不明白为什么我们需要将日期存储在单独的列中。当我们需要向一个简单的查询中添加逻辑时,这就很困难了。无论是在SP还是在代码中,我知道有时候我们会被一个糟糕的设计所困扰,而这个设计是别人为我们提供的。也许可以在表中添加一个计算列?如果你让它持久化,你甚至可以索引它。如果可能的话,从性能的角度来看,这将是一个更好的方法。这帮了大忙!非常感谢你。我在SQL方面不是最好的,所以这对我帮助很大。
    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'