Sql查询——涉及时间计算的数据库查询语句

1、查询说明:根据当前生产日期,保质期2年,实时更新状态,若没过期则状态为正常,若过期了则计算出过期天数。

--根据封样生产时间和保质期2年计算封样是否过期,实时更新封样状态
update FirstinspectionAccount set FyState=
case when DATEDIFF(YEAR,ProductionDate,GETDATE()) <2
     then '正常'
	 when DATEDIFF(YEAR,ProductionDate,GETDATE()) =2
	 then 
		case when DATEDIFF(MONTH,ProductionDate,GETDATE())<0
			then '正常'
			when DATEDIFF(MONTH,ProductionDate,GETDATE())=0
			then
				case when DATEDIFF(DAY,ProductionDate,GETDATE())<=0
					 then '正常'
					 when DATEDIFF(DAY,ProductionDate,GETDATE())>0
					 then '过期'+CONVERT(nvarchar(10),DATEDIFF(DAY,DATEADD(YEAR,2,ProductionDate),GETDATE()))+'天'
				end
			when DATEDIFF(MONTH,ProductionDate,GETDATE())>0
			then '过期'+CONVERT(nvarchar(10),DATEDIFF(DAY,DATEADD(YEAR,2,ProductionDate),GETDATE()))+'天'
		end
	 when DATEDIFF(YEAR,ProductionDate,GETDATE()) >2
	 then '过期'+CONVERT(nvarchar(10),DATEDIFF(DAY,DATEADD(YEAR,2,ProductionDate),GETDATE()))+'天'
end

2、查询说明:根据领用时间和领用时长,实时更新领用状态,若在领用时长内则状态为正常,若超过领用时长则计算超时小时数。

--根据领用时间和领用时长计算是否领用超时,实时更新领用状态
update FirstinspectionAccount set ReceivingState=
case when DATEDIFF(HOUR,ReceivingTime,GETDATE()) <=CONVERT(INT,SUBSTRING(ReceivingDuration,1,CHARINDEX('小',ReceivingDuration)-1))
     then '正常'
	 when DATEDIFF(HOUR,ReceivingTime,GETDATE()) >CONVERT(INT,SUBSTRING(ReceivingDuration,1,CHARINDEX('小',ReceivingDuration)-1))
	 then '超时'+CONVERT(nvarchar(10),DATEDIFF(HOUR,ReceivingTime,GETDATE())-CONVERT(INT,SUBSTRING(ReceivingDuration,1,CHARINDEX('小',ReceivingDuration)-1)))+'小时'
end

3、多表联合查询得出想要的信息

declare @uptime datetime select top 1 @uptime=c.上线时间 from 接料上线 c left join 扫描信息 b on c.机器编号=b.机器编号 where c.上线时间<b.扫描时间 order by c.上线时间 DESC
select a.*,b.扫描时间, @uptime 上线时间,b.机器编号,b.生产数量,b.余料使用数,d.真实姓名,case when b.扫描时间 is not null then 1 else 0 end 扫描状态,
                case when b.核对状态=0 then '未核对' else '已核对' end 核对状态,b.核对时间,b.核对人工号,b.核对人姓名,b.SxQRCode 上线接料二维码,b.MidQRCode 中途接料二维码 from 料站明细信息 a  
                left join 扫描信息 b on a.编号=b.[料站明细信息_编号] left join 用户信息 d on b.用户编号=d.用户名 where 1=1

4、常用的sql时间函数

(1)函数
GetDate( ) 返回系统目前的日期与时间
DateDiff (interval,date1,date2) 以interval指定的方式,返回date2 与date1两个日期之间的差值 date2-date1
DateAdd (interval,number,date) 以interval指定的方式,加上number之后的日期
DatePart (interval,date) 返回日期date中,interval指定部分所对应的整数值
DateName (interval,date) 返回日期date中,interval指定部分所对应的字符串名称

(2)举例
GetDate() 用于sql server :select GetDate()
DateDiff('s','2005-07-20','2005-7-25 22:56:32')返回值为 514592 秒
DateDiff('d','2005-07-20','2005-7-25 22:56:32')返回值为 5 天
DatePart('w','2005-7-25 22:56:32')返回值为 2 即星期一(周日为1,周六为7)
DatePart('d','2005-7-25 22:56:32')返回值为 25即25号
DatePart('y','2005-7-25 22:56:32')返回值为 206即这一年中第206天
DatePart('yyyy','2005-7-25 22:56:32')返回值为 2005即2005年

(3)参数值设定说明
参数 interval的设定值如下:
值 缩 写(Sql Server) Access 和 ASP 说明
Year Yy yyyy 年 1753 ~ 9999
Quarter Qq q 季 1 ~ 4
Month Mm m 月1 ~ 12
Day of year Dy y 一年的日数,一年中的第几日 1-366
Day Dd d 日,1-31
Weekday Dw w 一周的日数,一周中的第几日 1-7
Week Wk ww 周,一年中的第几周 0 ~ 51
Hour Hh h 时0 ~ 23
Minute Mi n 分钟0 ~ 59
Second Ss s 秒 0 ~ 59
Millisecond Ms - 毫秒 0 ~ 999 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值