首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查月份和年份是否在两个日期之间

如何检查月份和年份是否在两个日期之间
EN

Stack Overflow用户
提问于 2016-08-24 20:44:22
回答 2查看 1.4K关注 0票数 1

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

代码语言:javascript
复制
@Year int,
@Month int = null,
@Quarter int = null

现在,如果month是null,我只需要检查date,这很容易,但是如果提供了month,如何检查它是否位于startdateenddate之间,或者如果提供了@Quarter,我需要检查一年中的三个月是否与startdateenddate冲突。

到目前为止,我所写的是

代码语言:javascript
复制
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

请帮我处理月度和季度的情况

季度有4个可能的inuts范围在1-4之间,它的月份范围在@Quarter*3-3@Quarter*3之间

EN

回答 2

Stack Overflow用户

发布于 2016-08-24 20:58:07

不是我能测试的地方,但这里应该很近...

代码语言:javascript
复制
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)) )
    )
票数 0
EN

Stack Overflow用户

发布于 2016-08-24 22:39:16

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

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

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
SELECT ...
...
WHERE startDate >= @WhereStartDate
AND   enddate <= @WhereEndDate

这还有一个额外的好处,那就是可以进行sargable。您编写查询的方式是不可sargable的。(简而言之,非sargable查询将不能正确使用索引,并且性能将很差。如果表很大,则结果表扫描可能需要很长时间。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39123712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档