我在表startdate和enddate中有两列,我需要创建一个函数get all ID,它位于传递给函数的日期数据之间。我的函数输入参数是
@Year int,
@Month int = null,
@Quarter int = null现在,如果month是null,我只需要检查date,这很容易,但是如果提供了month,如何检查它是否位于startdate和enddate之间,或者如果提供了@Quarter,我需要检查一年中的三个月是否与startdate和enddate冲突。
到目前为止,我所写的是
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之间
发布于 2016-08-24 20:58:07
不是我能测试的地方,但这里应该很近...
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)) )
)发布于 2016-08-24 22:39:16
首先创建两个本地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。您编写查询的方式是不可sargable的。(简而言之,非sargable查询将不能正确使用索引,并且性能将很差。如果表很大,则结果表扫描可能需要很长时间。)
https://stackoverflow.com/questions/39123712
复制相似问题