在SQL之前和之后选择一天

时间:2014-12-29 07:10:09

标签: sql sql-server sql-server-2008

我有以下存储过程:

create procedure spListing
    (@oMonth int, @oYear int)
AS
BEGIN
    SELECT oDate, oValue 
    FROM oTable 
    WHERE DATEPART(MONTH, oDate) = @oMonth 
      AND DATEPART(YEAR, oDate) = @oYear
END

它将根据给定参数选择所选月份和年份的所有值。

我想在给定参数的基础上和之后选择1天。

例如:如果@oMonth ='9'且@oYear ='2014',则会显示2014年8月31日至2014年10月1日的列表。

有谁知道如何实现这个目标?

谢谢。

2 个答案:

答案 0 :(得分:2)

首先找到需要获取数据的两个日期。

DECLARE @oMonth INT=9,
        @oYear  INT=2014,
        @date   DATE

SELECT @date = Cast (CONVERT(VARCHAR(4), @oYear) + '-'
                     + CONVERT(VARCHAR(2), @oMonth) + '-01' AS DATE)

SELECT Dateadd(day, -1, @date) -- 2014-08-31(Startdate)
SELECT Dateadd(day, 1, Dateadd(day, -Day(@date), Dateadd(month, 1, @date))) --2014-10-01 (Endate)

现在您可以使用上述查询来过滤结果。像这样更改您的SP。

CREATE PROCEDURE Splisting (@oMonth INT,
                            @oYear  INT)
AS
  BEGIN
      DECLARE @date DATE

      SELECT @date = Cast (CONVERT(VARCHAR(4), @oYear) + '-'
                           + CONVERT(VARCHAR(2), @oMonth) + '-01' AS DATE)

      SELECT oDate,
             oValue
      FROM   oTable
      WHERE  oDate BETWEEN Dateadd(day, -1, @date) 
                   AND Dateadd(day, 1, Dateadd(day, -Day(@date), Dateadd(month, 1, @date)))
  END 

答案 1 :(得分:1)

我相信这回答了你的问题:

CREATE PROCEDURE spListing
(@oMonth int, @oYear int)
AS
BEGIN
   DECLARE @day int = 1;
   DECLARE @startDate date =  DATEADD(day,-1,DATEADD(mm, (@oYear - 1900) * 12 + @oMonth - 1 , @day - 1))
   DECLARE @endDate date =  DATEADD(month,1,DATEADD(mm, (@oYear - 1900) * 12 + @oMonth - 1 , @day - 1))

   SELECT oDate, oValue 
   FROM oTable WHERE oDate 
   BETWEEN @startDate AND @endDate 
END