我在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。
答案 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已被索引)。 ..)。