在SQL

时间:2016-05-19 14:04:38

标签: c# sql sql-server sql-server-2008 sql-server-2012

我在sql server中有一个表,它有几个字段,包括int中的expYear,int中的expMonth。

我正在编写一个SP来检索两个月之间的数据。如果M1和M2都在同一个(expMonth between @M1 and @M2) AND @currentYear=expYear中,我可以expYear执行此操作。

if my M1=11(december)是2016年的and M2=2(february)"expYear ",那就是2017年,那就不行了。

有谁能说出来该做什么?请记住,在DB中,"expMonth ""@M1"值都存储为int。偶数"@M2""@currentYear"__init__.py都是来自后端的int。

8 个答案:

答案 0 :(得分:2)

只有算术

declare @m1 int =11, @m2 int =1, @y1 int =2015, @y2 int=2016
select * 
from (
    values (2015,9),(2015,10),(2015,11),(2015,12),(2016,1),(2016,2),(2016,3),(2016,4)
    ) t(y,m)
where 100*y+m between 100*@y1+@m1 and 100*@y2+@m2 

答案 1 :(得分:0)

您可以连接两列并将其转换为datetime。之后,您可以使用BETWEEN运算符。

答案 2 :(得分:0)

问题是因为SQL不知道你的M1和M2正在压制几个月。对于它,这些仅仅是整数值。如果第一个值<1,则无法确定第二个值然后它必须导航到下一年。它只会搜索所提供年份的M1和M2之间的所有值。它将首先获得M1和M2值位于所提供范围之间的行,然后进一步将其细化为具有指定年份的行。因此,根据您的示例,它将获得2016年的行,其中M1和M2值介于11和2之间。

希望这会有所帮助。 :)

答案 3 :(得分:0)

您可以从列中输入正确的日期并输入并比较它们:

SELECT <ColumnsList>
FROM <TableName>
WHERE   CAST(RIGHT('0000' + CAST(expYear as varchar(4)), 4) + '-' + RIGHT('00' + CAST(expMonth as varchar(2)), 2) +'-01' As Date)
        BETWEEN CAST(RIGHT('0000' + CAST(@currentYear as varchar(4)), 4) + '-' + RIGHT('00' + CAST(@M1  as varchar(2)), 2) +'-01' As Date)
        AND CAST(RIGHT('0000' + CAST(@currentYear as varchar(4)), 4) + '-' + RIGHT('00' + CAST(@M2 as varchar(2)), 2) +'-01' As Date)

答案 4 :(得分:0)

您的SP只是查询数据,还是在对您的任何数据源执行操作?如果它只是查询,那么我的建议是为您的SP添加一个简单的中间步骤,将您的数据放入临时表并创建一个连接月份和年份的新变量。所以它可能看起来像这样:

Select *,
ExpMonth + "-" + ExpYear AS ExpDate
Into #temp  
From [table] 

然后,当您为存储过程设置参数时,可以从#temp查询并设置参数以查找两个ExpDates(11-2016和2-2017)之间的数据。

答案 5 :(得分:0)

如果@ M1为11且@M2为2,您如何知道对应于@ M1的年份是2015年而不是2014年或2013年? SQL Server也不知道你的意思,你只需要将一个整数比作&gt; = 11和&lt; = 2.没有值满足这个条件。

您需要传递每个年份和月份,如下所示:

DECLARE @FROM INT = 201511
DECLARE @TO INT = 201602

SELECT *
FROM yourtable
WHERE expYear * 100 + expMonth BETWEEN @FROM AND @TO

答案 6 :(得分:0)

您可以尝试重做这样的事情:

if @M1 > @M2
  ... (@currentYear*12+@M1) <= (expYear*12+expMonth) AND (expYear*12+expMonth) <= ((@currentYear+1)*12+@M2) ...
else
  ... (@currentYear*12+@M1) <= (expYear*12+expMonth) AND (expYear*12+expMonth) <= (@currentYear*12+@M2) ...
end

答案 7 :(得分:0)

您可能必须从定义两个名为@startYear(或@ Y1)和@endYear(或@ Y2)的“年”变量开始,然后您可以这样做:

SELECT *
FOM yourTable
WHERE (expYear > @Y1 OR (expYear = @Y1 AND expMonth >= @M1))
    AND (expYear < @Y2 OR (expYear = @Y2 AND expMonth <= @M2))

如果你的@ M1和@ M2变量值总是最多相隔一年(12),很容易只保留@currentYear(被认为是@ Y1)参数作为SP输入并从@计算@ Y2变量M1和@ M2比较。例如:

IF @M2 < @M1
BEGIN
    SET @Y2 = @Y1 + 1;
END
ELSE
BEGIN
    SET @Y2 = @Y1;
END

作为一个额外的信息,你不应该依赖查询中的expYear和expMonth列的计算(如其他答案所述),因为由于缺少索引使用,il可能效率很低(特别是如果expYear / expMonth已被索引)。 ..)。