Sql server 需要SQL查询的帮助吗?从周期季度表中选择日期范围

Sql server 需要SQL查询的帮助吗?从周期季度表中选择日期范围,sql-server,tsql,date,range,period,Sql Server,Tsql,Date,Range,Period,我有一张名为Periods的表格,看起来像这样 周期ID|周期年|周期季度 7 | 2009 | 1 8 | 2009 | 2 9 | 2009 | 3 10 | 2009 | 4 11 | 2010 | 1 12 | 2010 | 2 表中的每一行代表一年中4个季度中的1个季度(如3个月一次的学期)。例如,第一行表示2009年第1期(即日期范围为2009年1月1日至2009年3月31日) 现在,我需要编写一个查询,从上表中选择行/周期,其中周期出现在两个日期范围之间,如下伪代码所示 selec

我有一张名为Periods的表格,看起来像这样

周期ID|周期年|周期季度

7 | 2009 | 1

8 | 2009 | 2

9 | 2009 | 3

10 | 2009 | 4

11 | 2010 | 1

12 | 2010 | 2

表中的每一行代表一年中4个季度中的1个季度(如3个月一次的学期)。例如,第一行表示2009年第1期(即日期范围为2009年1月1日至2009年3月31日)

现在,我需要编写一个查询,从上表中选择行/周期,其中周期出现在两个日期范围之间,如下伪代码所示

select *
from Periods
where Period is between @startDate and @endDate
查询将在名为dbo.GetPeriodsFromDateRange的表值函数中使用,@startDate和@endDate是该函数的参数


我被卡住了,不知道怎么做。请帮助。这适用于t-SQL(MS SQL Server 2000/2005)

我想在表中再添加两列

开始日期结束日期-这些将存储每个期间开始和结束的日期(即,在您的示例中,开始日期=2009年1月1日,结束日期=2009年3月31日)

如果季度的定义与您建议的不同,这将为您提供更大的灵活性

如果这样做,查询就会变得相当简单

select *
from Periods
where @startDate<Periods.StartDate and @endDate>Periods.EndDate
选择*
从时期
其中@startDatePeriods.EndDate
这是假设您只想包含完全封装在@StartDate和@EndDate之间的时段。如果您想包含重叠的时段,请尝试以下操作

select *
from Periods
where @EndDate>Periods.StartDate and @StartDate<Periods.EndDate
选择*
从时期
其中@EndDate>Periods.StartDate和@StartDateTry


可以搜索而不是扫描:

SELECT *
FROM Periods
WHERE
   PeriodYear BETWEEN Year(@startdate) AND Year(@enddate)
   AND PeriodYear * 4 + PeriodQuarter
      BETWEEN Year(@startdate) * 4 + DATEPART(Quarter, @startdate)
      AND Year(@startdate) * 4 + DATEPART(Quarter, @enddate)
说明

我用两个组成部分,年和季度组成一个新的、按比例缩放的整数,将年和季度的每个组合视为一个数字

想象一下,我是这样做的:

AND PeriodYear + (PeriodQuarter - 1) / 4.0
   BETWEEN Year(@startdate) + (DATEPART(Quarter, @startdate) - 1) / 4.0
   AND Year(@startdate) + (DATEPART(Quarter, @enddate) - 1) / 4.0
将我的原始表达式称为“Mult”,将这个新表达式称为“Div”,以下是一些年份和季度以及这些表达式的计算结果:

Year Qtr Div Mult 2009 1 2009.00 8037 2009 2 2009.25 8038 2009 3 2009.50 8039 2009 4 2009.75 8040 2010 1 2010.00 8041 2010 2 2010.25 8042 2010 3 2010.50 8043 您可以看到它将如何返回正确的行。Mult版本的功能完全相同,只是将年份放大而不是季度缩小。我使用它的原因是整数数学和乘法比分数数学和除法更快

我之所以使用两个条件,从年份开始,是为了使查询更具可搜索性。我们希望基于年份进行搜索,如果我们将其乘以4或对其进行其他计算,这是不可能的。因此,我们首先将扫描分为正确的年份,然后对其进行微调,以消除不应出现在结果中的任何季度


另一种选择是添加一个计算列并在其上放置索引。这不需要对代码插入或更新进行任何更改(只要它们正确使用列列表),但可以让您按照自己的意愿进行常规范围的数学运算。

好主意,尽管这是不可能的。我还必须更改插入/更新到此表的查询,这在我的项目的这个阶段是不可行的。无论如何,它仍然可以归结为解决相同的问题。我们仍然必须找出如何将这些周期转换为date rangesLooks很有希望..忙着测试它。谢谢!工作起来很有魅力。谢谢伙计。我不知道dateadd函数也可以与quarters一起使用。这将强制扫描,因此如果你有一个季度和年份的索引,引擎将无法使用它,性能将受到影响。我不太明白WHERE子句的第二部分,以及乘法器Saajid Ismail,你看到我在下面的评论了吗,你选择的答案将强制扫描?而且它将更加CPU密集,因为它必须对整个表中的每一行计算一个表达式。。。 Year Qtr Div Mult 2009 1 2009.00 8037 2009 2 2009.25 8038 2009 3 2009.50 8039 2009 4 2009.75 8040 2010 1 2010.00 8041 2010 2 2010.25 8042 2010 3 2010.50 8043
WHERE Div BETWEEN 2009.25 AND 2010.00