第一个问题的思路:
use northwind
go
select * from orders 
where DATEDIFF( year,getdate(),orderdate)=0     --是否同年
  and DATEDIFF(Month,getdate(),orderdate)=0     --是否同月

解决方案 »

  1.   

    统计不一定要循环循环用
    while (条件)
    begin
    ...
    end
      

  2.   

    第二个问题不太理解,是否是用GROUP BY
      

  3.   

    DATEADD
    在指定日期新增一個時間間隔,並傳回新的 datetime 值。語法
    DATEADD ( datepart , number, date ) 引數
    datepart是指定日期中那一個部份要傳回新值的參數。下表列出了 Microsoft® SQL Server™ 所能辨認的日期部份及縮寫。Datepart 縮寫 
    Year yy, yyyy 
    quarter qq, q 
    Month mm, m 
    dayofyear dy, y 
    Day dd, d 
    Week wk, ww 
    Hour hh 
    minute mi, n 
    second ss, s 
    millisecond 微秒 
    numberdatepart 的遞增值。 如果您指定非整數的值,將截斷該值的小數部份。 例如,如果您指定 datepart為 day 且 number 為1.75,則 date 增加 1。date是一個傳回 datetime 或 smalldatetime 值或日期格式字元字串的運算式。如需關於指定日期的詳細資訊,請參閱 datetime 與 smalldatetime。 如果只指定年份的後面兩位數字,那麼小於或等於 two digit year cutoff 組態選項值最後兩位數字的值,會與截止年份位於相同世紀。大於此選項值最後兩位數字的值,其世紀為截止年份的前一個世紀。例如,若 two digit year cutoff 為 2049 (預設值),那麼 49 會被視為 2049,2050 則會被視為 1950。為了避免發生混淆,請使用四位數字的年份。傳回型別
    傳回 datetime,但若 date 引數是 smalldatetime,則為 smalldatetime。範例
    此範例印出 pubs 資料庫中標題的時間框架清單。這個時間框架代表現有的發行日期加上 21 天。USE pubs
    GO
    SELECT DATEADD(day, 21, pubdate) AS timeframe
    FROM titles
    GO以下為結果集:timeframe                   
    --------------------------- 
    Jul 3 1991 12:00AM          
    Jun 30 1991 12:00AM         
    Jul 21 1991 12:00AM         
    Jul 13 1991 12:00AM         
    Jun 30 1991 12:00AM         
    Jul 9 1991 12:00AM          
    Mar 14 1997  5:09PM         
    Jul 21 1991 12:00AM         
    Jul 3 1994 12:00AM          
    Mar 14 1997  5:09PM         
    Nov 11 1991 12:00AM         
    Jul 6 1991 12:00AM          
    Oct 26 1991 12:00AM         
    Jul 3 1991 12:00AM          
    Jul 3 1991 12:00AM          
    Nov 11 1991 12:00AM         
    Jul 3 1991 12:00AM          
    Jul 3 1991 12:00AM          (18 row(s) affected)
    另請參閱
      

  4.   

    第一个问题,每个月末做,你可以在创建一个作业来实现--创建作业
    exec msdb..sp_add_job @job_name='数据处理'--创建作业步骤
    declare @sql varchar(800),@dbname varchar(250)
    select @sql='exec p_process'  --数据处理的命令
    ,@dbname=db_name() --执行数据处理的数据库名exec msdb..sp_add_jobstep @job_name='数据处理',
    @step_name = '数据同步',
    @subsystem = 'TSQL',
    @database_name=@dbname,
    @command = @sql,
    @retry_attempts = 5,  --重试次数
    @retry_interval = 5   --重试间隔--下面两种调度方式你选择一种
    --添加作业调度(每月最后一天)
    EXEC msdb.dbo.sp_add_jobschedule @job_name = '数据处理',
    @freq_type = 32, 
    @active_start_time = 0,  --0点开始执行
    @freq_interval = 8,  --每月最后一天
    @freq_subday_type = 1, 
    @freq_subday_interval = 0, 
    @freq_relative_interval = 16, 
    @freq_recurrence_factor = 1/*--添加作业调度(每月最后一个工作日)
    EXEC msdb.dbo.sp_add_jobschedule @job_name = '数据处理', 
    @freq_type = 32, 
    @active_start_time = 0,  --0点开始执行
    @freq_interval = 9,  --每月最后一个工作日
    @freq_subday_type = 1, 
    @freq_subday_interval = 0, 
    @freq_relative_interval = 16, 
    @freq_recurrence_factor = 1
    --*/
    -- 添加目标服务器
    EXEC msdb.dbo.sp_add_jobserver 
    @job_name = '数据处理' ,
    @server_name = N'(local)' 
      

  5.   

    当然,建议你只写一个处理的过程,在需要的时候调用,因为不一定工作在月底都是可以完成的
    如果你自己要写过程,取每个月的最后一天的方法--本月的最后一天(你可以把getdate()换成任意一个日期)
    select dateadd(month,1,getdate()-day(getdate()))
      

  6.   

    循环的问题,用游标--示例--定义游标
    declare tb cursor for
    select 员工编号 from 员工表declare @员工编号 int--打开游标
    open tb--取第一条记录
    fetch next from tb into @员工编号--判断是否取数成功
    while @@fetch_status=0
    begin
    --处理语句 --读取下一条数据
    fetch next from tb into @员工编号
    end
    close tb
    deallocate tb
      

  7.   

    --那就更简单
    select getdate()-day(getdate())+1