我如何与一个月和一年进行比较,而不是一个完整的日期?

时间:2011-08-27 03:19:21

标签: sql sql-server tsql sql-server-2008

我需要编写一个存储过程来允许某人搜索数据库。但是,我得到的只是一个月和一年的整数。 db有月份和年份字段。但我无法弄清楚如何设置比较。

Ex:我得到2008年3月和2010年6月。

我需要在数据库中搜索记录,其中由月份和年份字段指定的日期介于两个日期之间。

修改

给定两个Date输入,如何找到这些日期之间的所有记录?每条记录只有表示年份和月份的整数。

3 个答案:

答案 0 :(得分:5)

以前的解决方案应该可行,但不幸的是它们会阻止在年份和月份列上使用索引。

你可能必须以艰难的方式解决它:

SELECT  *
FROM    records
WHERE   Year > @StartYear
        OR ( Year = @StartYear
             AND Month >= @StartMonth)
/*(ommited end date check, it is same)*/

另一种可能性是将计算日期列添加到源表

以这种方式存储日期是可疑的,从DB设计的角度来看可能不正确。考虑将日期存储在日期列中(如果确实需要),添加年和月的计算列。

答案 1 :(得分:1)

假设在SQL Server中提供了名为@StartDate和@EndDate的日期变量:

SELECT
  *
FROM
  MyTable
WHERE  
  -- yields "200901 between 200801 and 201104" on inputs 01-01-2008, 04-01-2011
  Convert(VarChar(10), MyTable.Year) + Replace(Str(MyTable.Month, 2), ' ', '0')
   BETWEEN
  Convert(VarChar(10), YEAR(@StartDate)) + Replace(Str(MONTH(@StartDate), 2), ' ', '0')
   AND
  Convert(VarChar(10), YEAR(@EndDate)) + Replace(Str(MONTH(@EndDate), 2), ' ', '0')

<强>参考

答案 2 :(得分:0)

非常规方法:

select * from sometable
    where YourYear * 100 + YourMonth 
    between @SomeStartYear * 100 + @SomeStartMonth and @SomeendYear * 100 + @SomeEndMonth