如何在SQL中选择每月的第一天

时间:2017-04-12 12:44:06

标签: sql sql-server sql-server-2008

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中实现这个.. ???

提前致谢。

2 个答案:

答案 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,但你可以从这里开始。希望这会有所帮助!!