在SQL Server中选择记录日期范围

时间:2015-08-06 13:25:30

标签: sql-server datetime

我有一个表,其中包含具有UserId,生效日期(数据类型日期)和&的资源的比率。结束日期(数据类型日期)

RateId UserId Rate     EffectiveDate          EndDate
============================================================================
21  169 82  2015-01-01 00:00:00.000 2025-12-30 00:00:00.000
23  78  58  2015-07-01 00:00:00.000 2015-07-14 00:00:00.000
24  88  68  2015-07-01 00:00:00.000 2025-12-30 00:00:00.000
25  114 78  2015-07-01 00:00:00.000 2025-12-30 00:00:00.000
26  218 56  2015-07-01 00:00:00.000 2025-12-30 00:00:00.000
27  78  89  2015-07-15 00:00:00.000 2025-12-30 00:00:00.000
28  174 69  2015-01-01 00:00:00.000 2015-08-14 00:00:00.000
29  174 59  2015-08-15 00:00:00.000 2025-12-30 00:00:00.000
30  235 65  2015-01-01 00:00:00.000 2015-08-14 00:00:00.000
31  235 84  2015-08-15 00:00:00.000 2025-12-30 00:00:00.000
32  234 49  2015-08-01 00:00:00.000 2015-08-14 00:00:00.000
33  234 59  2015-08-15 00:00:00.000 2025-12-30 00:00:00.000
34  303 89  2014-10-01 00:00:00.000 2015-08-14 00:00:00.000
35  303 75  2015-08-15 00:00:00.000 2025-12-30 00:00:00.000
36  481 84  2015-01-01 00:00:00.000 2025-12-30 00:00:00.000

我需要为那些费率仅在当前月份范围内(在开始日期和月末日期之间)的用户选择费率。

这就是我现在所做的。

DECLARE @MONTH INT
DECLARE @YEAR INT
DECLARE @STARTDATEOFMONTH DATE
DECLARE @LASTDATEOFMONTH DATE
SET @MONTH = 8 /*Current Month*/
SET @YEAR = 2015 /*Current Year*/
SET @STARTDATEOFMONTH = DATEADD(MONTH,@MONTH-1,DATEADD(YEAR,@YEAR-1900,0)) /*FIRST*/
SET @LASTDATEOFMONTH = DATEADD(DAY,-1,DATEADD(MONTH,@MONTH,DATEADD(YEAR,@YEAR-1900,0))) /*LAST*/

SELECT * FROM TRNS_RATE_DETAILS
  WHERE  @STARTDATEOFMONTH >= EFFECTIVEDATE 
  AND @LASTDATEOFMONTH <= ENDDATE

我正在计算每个月的开始日期和结束日期(比如上面的查询我已经过了当月= 8&amp; year = 2015)

查询输出

RateId  UserId  Rate       EffectiveDate          EndDate
============================================================================
21  169 82  2015-01-01 00:00:00.000 2025-12-30 00:00:00.000
24  88  68  2015-07-01 00:00:00.000 2025-12-30 00:00:00.000
25  114 78  2015-07-01 00:00:00.000 2025-12-30 00:00:00.000
26  218 56  2015-07-01 00:00:00.000 2025-12-30 00:00:00.000
27  78  89  2015-07-15 00:00:00.000 2025-12-30 00:00:00.000
36  481 84  2015-01-01 00:00:00.000 2025-12-30 00:00:00.000

正如您所见,我只能获得当前月份开始日期之前的记录。在当月的最后一个日期之后。

我需要获得那些生效日期和时间的记录。结束日期介于开始日期和结束日期之间。每个月的结束日期。

说,我在2015年1月1日(生效日期)到8月14日(结束日期)之间的日期资源(UserId)的比率= 45,而2015年8月15日(生效日期)之间的另一个比率= 75 )到2025年12月30日(结束日期)

所以我实际上想要2015年8月的同一资源的两种费率(45&amp; 75)?

请帮帮我!

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您只想使用当月,可以使用DATEPARTGETDATE

SELECT * FROM TRNS_RATE_DETAILS
  WHERE  
  (
   (DATEPART(month,EFFECTIVEDATE) <= DATEPART(month,GETDATE())
   AND DATEPART(year,EFFECTIVEDATE) = DATEPART(year,GETDATE()))
   OR
   DATEPART(year,EFFECTIVEDATE) < DATEPART(year,GETDATE())
   )
  AND 
  (
   (DATEPART(month,ENDDATE) >= DATEPART(month,GETDATE())
   AND DATEPART(year,ENDDATE) = DATEPART(year,GETDATE()))
   OR
   DATEPART(year,ENDDATE) > DATEPART(year,GETDATE())
  )

答案 1 :(得分:0)

你想在startdate和lastdate之间使用EFFECTIVEDATE ......但实际上你要求数据库记录的startdate大于生效日期....这与你想要的相反。

尝试:

{{1}}

顺便说一下,您是否只是使用提取功能检查月份?

答案 2 :(得分:0)

也许这会对你有所帮助:

SELECT * 
FROM    TRNS_RATE_DETAILS
WHERE   (MONTH(EFFECTIVEDATE)   =   @MONTH  AND YEAR(EFFECTIVEDATE) =   @YEAR)
OR      (MONTH(ENDDATE)         =   @MONTH  AND YEAR(ENDDATE)       =   @YEAR)