Sql server 在SQL Server中选择超过日期范围的记录

Sql server 在SQL Server中选择超过日期范围的记录,sql-server,datetime,Sql Server,Datetime,我有一个表,它保存了具有UserId、生效日期(datatype Date)和结束日期(datatype Date)的资源的速率 我需要为那个些费率仅在当前月份范围内的用户选择费率(在该月的开始日期和结束日期之间) 这就是我到目前为止所尝试的 DECLARE @MONTH INT DECLARE @YEAR INT DECLARE @STARTDATEOFMONTH DATE DECLARE @LASTDATEOFMONTH DATE SET @MONTH = 8 /*Current Month

我有一个表,它保存了具有UserId、生效日期(datatype Date)和结束日期(datatype Date)的资源的速率

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

这就是我到目前为止所尝试的

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
正如你们所看到的,我只能得到那个些在本月开始日期之前和本月最后一个日期之后的记录

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

比如说,2015年1月1日(生效日期)至8月14日(结束日期)期间的资源(用户ID)费率为45,而2015年8月15日(生效日期)至2025年12月30日(结束日期)期间的资源(用户ID)费率为75

因此,我实际上想要2015年8月相同资源的两个费率(45和75)

请帮帮我


谢谢

您希望生效日期介于startdate和lastdate之间。。。但实际上,您要求db提供startdate大于生效日期的记录。。。。这与你想要的正好相反

尝试:

从TRNS\u RATE\u详细信息中选择*
其中生效日期>=@STARTDATEOFMONTH

和ENDDATE如果您只想使用当前月份,可以使用
DATEPART
GETDATE

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())
  )
从TRNS\u RATE\u详细信息中选择*
哪里
(
(DATEPART(月,生效日期)=DATEPART(月,GETDATE())
和DATEPART(year,ENDDATE)=DATEPART(year,GETDATE())
或
DATEPART(year,ENDDATE)>DATEPART(year,GETDATE())
)

也许这会帮助您:

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

为什么您需要当月的最后一天?换个角度考虑-你想要>=本月的第一天,和<下个月的第一天。这不是一个能解决你问题的查询,而是一个计算你的范围的简单方法。你想要当月(即8月)还是30天?@AaronBertrand说,对于一个用户,我只有一个15年1月1日到12月1日的费率,但对于另一个用户,我有两个费率,一个是1月1日到8月14日,15日,第二个是8月15日,从12月15日到12月31日,你的建议在这种情况下有效吗?@Samcd 8月(每个月)不是一个30天的周期,只是每个月的开始和结束日期之间的利率下降。对不起,我不知道,我还没有试着去探究你的实际问题。我只是提醒你不要在两者之间使用(>=我运行了你的查询,我只得到生效日期为8月的记录,那么生效日期为1月15日,结束日期为12月15日的记录呢,这不也是8月的记录吗?因为有些月份有两个不同的值。谢谢你的回复,但你的查询只给出了生效日期和结束日期的记录日期在当前月份,但我也希望这些记录的生效日期为2015年1月1日,结束日期为2025年12月30日(2015年8月也在这些日期范围内)。Hi vinay,只需尝试一下,从TRNS_RATE_DETAILS中选择*,其中(年(生效日期)=@年)或(年(结束日期)=@年)如果两者都需要,请使用此…………从TRNS_RATE_DETAILS中选择*,其中(YEAR(EFFECTIVEDATE)=@YEAR)和(YEAR(ENDDATE)=@YEAR)这将帮助您按EFFECTIVEDATE、ENDDATE排序记录订单
SELECT * FROM TRNS_RATE_DETAILS
  WHERE EFFECTIVEDATE >= @STARTDATEOFMONTH 
AND ENDDATE <=@LASTDATEOFMONTH
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())
  )
SELECT * 
FROM    TRNS_RATE_DETAILS
WHERE   (MONTH(EFFECTIVEDATE)   =   @MONTH  AND YEAR(EFFECTIVEDATE) =   @YEAR)
OR      (MONTH(ENDDATE)         =   @MONTH  AND YEAR(ENDDATE)       =   @YEAR)