DECLARE @from_date DATETIME,
@Monthnos INT
SET @From_Date='2016-04-01'
SET @Monthnos=1
SELECT dmcode,
CASE
WHEN entitystatus IN ( 'Active' )
AND CONVERT(DATE, codedate, 103) BETWEEN Dateadd(dd, Datediff(dd,
Datepart(dd,
Dateadd(m, monthnos,
@from_date)), 1),
Dateadd(m, monthnos, @from_date))
AND
Dateadd(dd, Datediff(dd,
Datepart(
dd,
Dateadd(m, monthnos,
@from_date)), 0),
Dateadd
(m, monthnos, @from_date)
) THEN
Sum(agentpartyid)
END AS ActiveCount,
CASE
WHEN entitystatus IN ( 'Inactive', 'Suspend' )
AND CONVERT(DATE, codedate, 103) = Dateadd(dd, Datediff(dd,
Datepart(dd,
Dateadd(m, monthnos
,
@from_date)), 0),
Dateadd(m, monthnos, @from_date))
THEN Sum(agentpartyid)
END AS InActiveCount
FROM cms_v_agency_dump_master AD WITH (nolock)
INNER JOIN #branch_mom BM WITH (nolock)
ON AD.dmcode = BM.dm_code
GROUP BY dmcode,
entitystatus,
CONVERT(DATE, codedate, 103),
monthnos
我有上面提到的查询我想要一个活跃的代理人数和他们在每个月的第一天和最后一天之间的编码日期,如果代理人处于非活动状态或暂停状态,那么他们的编码日期等于每个月的最后一天。 其中Monthnos是我们的财政月份,即(如果月份是4月,那么monthnos = 1,4月,那么monthnos = 2,依此类推......)。 那么,我怎么能在sql中实现这个.. ???
提前致谢。
答案 0 :(得分:0)
如果您只想在每个月的第一天之间进行查询,假设您的DATETIME字段为monthnos
,则只需添加:
WHERE DATEDIFF(month, monthnos, GETDATE())=1
答案 1 :(得分:0)
这是您如何获得员工开始的月份的第一天。确保将GETDATE()替换为表中指定开始日期的日期字段。您可以按原样复制并粘贴此内容,以了解输出的外观。
select dateadd(month,datediff(month,0,dateadd(m,0,getdate())),0)
这个将为您提供员工终止月份的最后日期。和之前一样,用表中的日期字段替换GETDATE()。
select dateadd(s,-1,dateadd(mm,datediff(mm,0,getdate())+1,0))
这些是有用的,因为它们在SELECT语句中它们不会干扰您在提取数据时设置的条件。他们只是转换日期的样子。
以下是您的查询的样子:
SELECT dateadd(month,datediff(month,0,dateadd(m,0,GETDATE())),0) AS StartDate,
dateadd(s,-1,dateadd(mm,datediff(mm,0,GETDATE())+1,0)) AS EndDate
FROM cms_v_agency_dump_master AD WITH (nolock)
INNER JOIN #branch_mom BM WITH (nolock)
ON AD.dmcode = BM.dm_code
GROUP BY ....
您不再需要声明和设置。我对你的数据库不太熟悉,无法填写GROUP BY,但你可以从这里开始。希望这会有所帮助!!