如何检查月份和年份是否介于2个日期之间

时间:2016-08-24 12:44:22

标签: sql-server sql-server-2008 date sql-date-functions

我在表startdateenddate中有2列,我需要创建一个函数get all ID,它位于函数中传递的日期数据之间。 我的函数输入参数是

@Year int,
@Month int = null,
@Quarter int = null

现在,如果月份为null,我只需要检查日期,这很简单,但是如果提供月份,如何查看它是否在startdateenddate之间,或者@Quarter提供1}}我需要检查一年中的3个月是否与startdateenddate发生冲突。

我现在写的是

CREATE FUNCTION GetAssociatesEmpID(
    @Year int,
    @Month int = null,
    @Quarter int = null
)
RETURNS TABLE
AS BEGIN
IF @Month IS NOT NULL -- Monthly Statistics
    BEGIN

    END
ELSE IF @Quarter IS NOT NULL -- Quarterly Statistics
    BEGIN

    END
ELSE -- Yearly Statistics
    BEGIN
        return SELECT ID FROM Table WHRER @Year>=YEAR(startdate) AND @Year<=YEAR(enddate)
    END
END

请帮助我了解月份和季度的情况

Quarter有4个可能的输入范围在1-4之间 其月份范围介于@Quarter*3-3@Quarter*3

之间

2 个答案:

答案 0 :(得分:0)

不是我可以测试的地方,但这应该很接近......

WHERE 
    (@Year >= YEAR(startdate)) 
    AND 
    (@Year <= YEAR(startdate)) 
    AND 
    (
        ( (@Month IS NOT NULL) AND (@Month >= MONTH(startdate)) AND (@Month <= MONTH(startdate)) )
        OR 
        ( (@Month IS NULL) AND (@Quarter >= DATEPART(QUARTER, startdate)) AND (@Quarter <= DATEPART(QUARTER, startdate)) )
    )

答案 1 :(得分:0)

首先创建两个本地DateTime变量。 (或DateTime2,或者表的开始和结束日期列使用的任何数据类型。)也许称它们为@WhereStartDate和@WhereEndDate。

使用一些IF语句填充新的@WherexxxDate变量。例如,如果提供了Month,则类似于:

DECLARE @Year int = 2016;
DECLARE @Month int = 3;
DECLARE @WhereStartDate datetime;
DECLARE @WhereEndDate datetime;

SET @WhereStartDate = CONVERT( datetime, CAST(@Year as char(4)) + '/' + CAST(@Month as varchar(2)) + '/01');
SET @WhereEndDate = DATEADD( day, -1, DATEADD( month, 1, @WhereStartDate ));

SELECT @WhereStartDate, @WhereEndDate;

一旦有了实际的日期/时间变量,就可以适当地编写查询......

SELECT ...
...
WHERE startDate >= @WhereStartDate
AND   enddate <= @WhereEndDate

这具有被sargable的额外好处。您编写查询的方式是不可思议的。 (简而言之,不可搜索的查询将无法正确使用索引,并且性能会很差。如果表很大,则生成的表扫描可能需要很长时间。)