关于如何取时间的问题!
我现在要写一个存储过程,如果当前时间是0点到8点就将a存入表中,如果是8点到16点就将b存入表中,如果是16点到24点就将c存入表中,还有就是问一下什么样的数据类型能存储英文字母,象a,b,c,请把代码写具体点谢谢,我还是新手!!
------解决方案------------------------------------------------测试用表
create table #a (a int,b varchar(2))
create table #b (a int,b varchar(2))
create table #c (a int,b varchar(2))
---------------------------------------开始
create proc protest @a int,@b varchar(2) as
declare @tb varchar(10)
select @tb=(case when DATEPART(hh,getdate()) between 0 and 7 then '#a ' when DATEPART(hh,getdate()) between 8 and 15 then '#b ' else '#c ' end)
exec( 'insert '+@tb+ ' select '+@a+ ', ' ' '+@b+ ' ' ' ')
------------------------------结
exec protest 1, 'abc '--调用
-------------------------------验证
select * from #a
select * from #b
select * from #c
用varchar比较好,不用考虑空格,空间上也好控制(例中abc只保留了ab)
------解决方案--------------------取系统如果当前时间中的小时可以用 datepart(hh,GETDATE()),所以写起来就很简单了
什么样的数据类型能存储英文字母?
------------------------------------
char varchar 都能存
定义一个表,存放字母
create table [表](abc char(1))
GO
--下面开始判断
DECLARE @hour int
SET @hour = datepart(hh,GETDATE())
if (@hour > = 0 OR (@hour <= 8) --0点到8点
BEGIN
insert into [表] values( 'a ') --将a存入表中
END
else if (@hour > 8 OR (@hour <= 16) --8点到16点
BEGIN
insert into [表] values( 'b ') --将b存入表中
END
else --16点到24点
BEGIN
insert into [表] values( 'c ') --将c存入表中
END
--查看数据
select * from [表]
------解决方案---------------------- 我改了一下,修正了一些内容
CREATE PROCEDURE insert_into_pingjun AS
SET NOCOUNT ON
declare @riqip datetime
declare @jtsfp float
declare @jtzlp float
declare @jtsjzlp float
declare @a datetime
declare @b datetime
declare @xiaoshi varchar(5)
set @a=getdate()--系统时间
-- 00:00至08:00执行的这一次,统计昨天16:00至00:00的数据:
if datepart(hour, @a) / 8 = 0
begin
set @a = convert(varchar(10), getdate(), 120) + ' 00:00.000 '--设置为绝对0点
/*
既然是昨天的数据,@riqip应该是昨天,你原来@riqip应该有问题——你的调度应该是:每天-> 间隔8小时-> 开始时间00:00,开始时间不可能是08:00,如果08:00开始,那么每天只调度了2次,不是3次。
*/
set @riqip=dateadd(day, -1, @a)
set @xiaoshi = 'c '
/*
这里可以判断一下pingjun,如果有日期=@riqip and xiaoshi = 'c '的数据,证明已经做过了,不需要重复,直接return,我不知道pingjun的字段名,就不写了。严格执行调度当然不会有问题,但如果我在查询分析器运行10次,那就有10条重复的数据,总得考虑周详一些。下同。
*/
end
-- 08:00至16:00执行的这一次,统计昨天00:00至08:00的数据:
else if datepart(hour, @a) / 8 = 1
begin
set @a = convert(varchar(10), getdate(), 120) + ' 08:00.000 '--设置为绝对8点
set @riqip=convert(char(10),getdate(),120)
set @xiaoshi = 'a '
end
-- 16:00至00:00执行的这一次,统计昨天08:00至16:00的数据:
else
begin
set @a = convert(varchar(10), getdate(), 120) + ' 16:00.000 '--设置为绝对16点
set @riqip=convert(char(10),getdate(),120)
set @xiaoshi = 'b '
end
/*
为什么要取绝对正点,因为即使你00:00启动Job,getdate()并不等于 '00:00:00.000 ',而是有一定滞后,根据SQL的忙与空闲,可能滞后时间不同,导致有的重复参与AVG,有的没有AVG。
*/
set @b=(select dateadd(hh,-8,getdate()))
--set @riqip=convert(char(10),getdate(),120)
select @jtsfp = avg(jtsf) from ceshi where guanhao = 1 and tmdt < @a and tmdt > = @b
select @jtzlp = avg(jtzl) from ceshi where guanhao = 1 and tmdt < @a and tmdt > = @b
select @jtsjzlp = avg(jtsjzl) from ceshi where guanhao = 1 and tmdt < @a and tmdt > = @b
/*
不需要set ??=(select ...)