我在表startdate
和enddate
中有2列,我需要创建一个函数get all ID
,它位于函数中传递的日期数据之间。
我的函数输入参数是
@Year int,
@Month int = null,
@Quarter int = null
现在,如果月份为null
,我只需要检查日期,这很简单,但是如果提供月份,如何查看它是否在startdate
和enddate
之间,或者@Quarter
提供1}}我需要检查一年中的3个月是否与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
请帮助我了解月份和季度的情况
Quarter有4个可能的输入范围在1-4之间
其月份范围介于@Quarter*3-3
和@Quarter*3
答案 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的额外好处。您编写查询的方式是不可思议的。 (简而言之,不可搜索的查询将无法正确使用索引,并且性能会很差。如果表很大,则生成的表扫描可能需要很长时间。)