关于sql时间处理的一些小示例

DAY函数:返回一个整数,表示指定日期天的DatePart(时间)部分
此函数等价于 DATEPART(dd, date)。
返回类型为int

 

--示例:
SELECT DAY('03/12/1998') AS 'Day Number';
GO

--下面是结果集: 
Day Number 
------------ 
12        

 

在下面的示例中,日期被指定为数字。Microsoft SQL Server 2005 Database Engine 将 0 解释为 1900 年 1 月 1 日。

 

SELECT MONTH(0), DAY(0), YEAR(0)

--下面是结果集: 
----- ------ ------
1     1      1900

 

 

datepart函数:返回表示指定日期的指定日期部分的整数.
DAY、MONTH、和 YEAR 函数分别是 DATEPART(dd, date)、DATEPART(mm, date) 和 DATEPART(yy, date) 的同义词。
DATEPART(dd, date)、DATEPART(mm, date) 和 DATEPART(yy, date) (分别返回天,月,年)

语法:
DATEPART ( datepart , date )

 

select datepart(mm,'2008-1-2')

下面是结果集: 
----- ------ ------
1

 

DateAdd函数:返回给指定日期加上一个时间间隔后的新 datetime 值.
语发:DATEADD (datepart , number, date )
datepart代表格式如:dd,yy,mm等.

 

select Dateadd(yy,1,'2008-01-01')

--下面是结果集: 
----- ------ ------
2009-01-01 00:00:00.000

 

 

示例:
--得出某月某日所在月份中的最大天数

select day(dateadd(dd,-day('2008-02-13'),dateadd(mm,1,'2008-02-13')))

--解释:
select dateadd(mm,1,'2008-02-13') 

--返回的是:2008-03-13 00:00:00.000

select -day('2008-02-13')
--返回的是:-13

--所以得出某月某日所在月份中的最大天数

--返回:29

 

 

  示例:
修改时间字段的小时部分

--把所有时间2006-11-1的数据 23点 修改为 21点
create table Testminute
(
	id int primary key identity,
	date datetime
)
go

select * from testminute
go

insert into testminute values ('2009-1-1 23:44');
insert into testminute values ('2009-1-1 22:44');
insert into testminute values ('2009-1-1 23:44');
insert into testminute values ('2009-1-1 21:44');
insert into testminute values ('2009-1-1 23:44');


select convert(varchar(30),date,8) from testminute

--返回:
21:44:00
22:44:00
21:44:00
21:44:00
21:44:00


select substring(convert(varchar(30),date,8),3,7) from testminute
--返回:
:44:00
:44:00
:44:00
:44:00
:44:00

根据以上思路就可以实现把所有时间2006-11-1的数据 23点 修改为 21点
update testminute set date='2009-1-1 21'+
substring(convert(varchar(30),date,8),3,7) where datepart(hour,date)=23

 

 

DATEDIFF 函数计算指定的两个日期中第二个日期与第一个日期的时间差的日期部分。换句话说,它得出两个日期之间的间隔。结果是等于 date2 - date1 的日期部分的带符号整数值。

 

示例:
select datediff(day,date,'2009-02-01') from testminute

--返回:
31
31
31
31
31

 

 

--显示文章、提交人和最后回复时间 示例:
IF OBJECT_ID('tablename') IS NOT NULL
  DROP TABLE tablename
GO

CREATE TABLE tablename(title varchar(100),username varchar(10),adddate datetime)
go

insert into tablename
select 'a','j','2009-7-11 18:47' union all
select 'a','k','2009-7-11 18:30' union all
select 'a','e','2009-7-11 18:39' union all
select 'c','f','2009-7-11 18:37' union all
select 'c','g','2009-7-11 18:39' 
go

select title,username,adddate from tablename a where adddate in(
select max(adddate) adddate from tablename where title=a.title) 

/*
title                                                                                                username   adddate
---------------------------------------------------------------------------------------------------- ---------- -----------------------
c                                                                                                    g          2009-07-11 18:39:00.000
a                                                                                                    j          2009-07-11 18:47:00.000

(2 行受影响)
*/

 

 

日程安排提前5分钟提醒 示例:
--第一个例子
IF OBJECT_ID('TabSchedule ') IS NOT NULL
  DROP TABLE TabSchedule 
GO
CREATE TABLE TabSchedule (username varchar(10),开始时间 datetime)
go
insert into TabSchedule
select 'a','2009-7-11 18:45'  union all
select 'b','2009-7-11 18:46'  union all
select 'c','2009-7-11 18:47'  union all
select 'd','2009-7-11 18:49'  union all
select 'e','2009-7-11 18:31'  
go

Select * from TabSchedule where datediff(minute,getdate(),开始时间) <5 
/*
username   开始时间
---------- -----------------------
a          2009-07-11 18:45:00.000
e          2009-07-11 18:31:00.000

(2 行受影响)*/

 

这里的意思是,当前时间快接近日程开始时间,低于5分钟的差时,获取该日程信息。
  你的假设:当前时间已经超过了开始时间,这种情况在开发的时候是不会出现的。
  因为在这之前,肯定都已经执行了这个语句,获取了日程安排,做了提醒。难道程序不做记录吗,永远这样执行下去吗,肯定不是。
  一旦提醒过了,你的程序肯定要对该日程的状态做更新,说明该日程已经提醒过了,或者删除这个过期的日程安排了。
  你明白我说的意思吗?

你可能感兴趣的:(sql,C++,c,SQL Server,Go)