【问题标题】:How to check if a month and year lies between 2 dates如何检查月份和年份是否位于两个日期之间
【发布时间】:2016-12-31 14:42:19
【问题描述】:

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

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

现在如果月份是null,我只需要检查简单的日期,但是如果提供月份,如何检查它是否位于startdateenddate 之间,否则如果提供@Quarter,我需要检查一年中的 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 个可能的 inut 范围在 1-4 之间 它的月份范围在@Quarter*3-3@Quarter*3之间

【问题讨论】:

  • YEAR(@Year) 没有任何意义,@Year 已经是INT
  • @Lamak oh mybad 谢谢指点
  • 2016 年 1 月是否介于 2016-01-30 和 2016-02-02 之间?
  • @MikeSherrill'CatRecall' 是的
  • 看起来您只是想检查两个间隔是否重叠。第一个间隔在startdateenddate 之间。第二个间隔由过程的参数定义。使用多个 IFs 将您的 @Year@Month@Quarter 参数转换为两个正确的日期,然后检查是否重叠。

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


【解决方案1】:

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

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)) )
    )

【讨论】:

    【解决方案2】:

    首先创建两个本地 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-29
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多