第一个问题的思路:
use northwind
go
select * from orders
where DATEDIFF( year,getdate(),orderdate)=0 --是否同年
and DATEDIFF(Month,getdate(),orderdate)=0 --是否同月
use northwind
go
select * from orders
where DATEDIFF( year,getdate(),orderdate)=0 --是否同年
and DATEDIFF(Month,getdate(),orderdate)=0 --是否同月
while (条件)
begin
...
end
在指定日期新增一個時間間隔,並傳回新的 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)
另請參閱
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)'
如果你自己要写过程,取每个月的最后一天的方法--本月的最后一天(你可以把getdate()换成任意一个日期)
select dateadd(month,1,getdate()-day(getdate()))
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
select getdate()-day(getdate())+1