SQL时间操作

一,统计语句

1, - 统计当前【>当天00点以后的数据】

SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT(Nvarchar, GETDATE(), 111)   ORDER BY dateandtime DESC
 
 

2, - 统计本周

SELECT * FROM 表 WHERE datediff(week,[dateadd],getdate())=0
 
 

3, - 统计本月

SELECT * FROM 表 WHERE datediff(month,[dateadd],getdate())=0
 
 

4,统计当前


 
 
  1. SELECT * FROM 表 WHERE datediff(day,[dateadd],getdate())=0
  2. Select * From table with(nolock) Where Convert(varchar(10),[CreateTime],120) = Convert(varchar(10),getDate(),120)

二,时间函数

如图1所示,当前系统日期,时间

select getdate() 
 
 

2,dateadd在向指定日期加上一段时间的基础上,返回新的datetime值,例如:向日期加上2天

select dateadd(day,2,'2004-10-15')   --返回:2004-10-17 00:00:00.000
 
 

3,dateiff返回跨两个指定日期的日期和时间边界数

select datediff(day,'2004-09-01','2004-09-18')    --返回:17
 
 

4,datepart返回代表指定日期的指定日期部分的整数

SELECT DATEPART(month, '2004-10-15')   --返回 10
 
 

5,datename返回代表指定日期的指定日期部分的字符串

SELECT datename(weekday, '2004-10-15')   --返回:星期五
 
 

6,day(),month(),year() - 可以与datepart对照一下


 
 
  1. select 当前日期=convert(varchar(10),getdate(),120),
  2. select 当前时间=convert(varchar(8),getdate(),114),
  3. select datename(dw,'2004-10-15')
  4. select 本年第多少周=datename(week,'2004-10-15'),
  5. select 今天是周几=datename(weekday,'2004-10-15')

如图7所示,求相差天数

select   datediff(day,'2004-01-01',getdate()) 
 
 

8,一个月第一天的

SELECT   DATEADD(mm,   DATEDIFF(mm,0,getdate()),   0) 
 
 

9,本周的星期一


 
 
  1. SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
  2. select dateadd(wk,datediff(wk,0,getdate()),6)

10,一年的第一天

SELECT   DATEADD(yy,   DATEDIFF(yy,0,getdate()),   0)
 
 

11,季度的第一天

SELECT   DATEADD(qq,   DATEDIFF(qq,0,getdate()),   0)
 
 

12,当天的半夜

SELECT   DATEADD(dd,   DATEDIFF(dd,0,getdate()),   0)
 
 

13,上个月的最后一天

SELECT   dateadd(ms,-3,DATEADD(mm,  DATEDIFF(mm,0,getdate()),   0))
 
 

14,去年的最后一天

SELECT   dateadd(ms,-3,DATEADD(yy,   DATEDIFF(yy,0,getdate()),   0)) 
 
 

15,本月的最后一天

SELECT   dateadd(ms,-3,DATEADD(mm,   DATEDIFF(m,0,getdate())+1,   0))
 
 

16,本年的最后一天

SELECT   dateadd(ms,-3,DATEADD(yy,   DATEDIFF(yy,0,getdate())+1,   0))
 
 

17,本月的第一个星期一

select   DATEADD(wk,  DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())),   0)
 
 

18,查询本周注册人数


 
 
  1. select count(*) from [user]
  2. where datediff(week,create_day-1,getdate())=0

19,上周注册人数


 
 
  1. select count(*) from [user]
  2. where datediff(week,create_day-1,getdate())=1

20,本月注册人数


 
 
  1. select count(*) from [user]
  2. where datediff(month,create_day,getdate())=0

21,上月注册人数


 
 
  1. select count(*) from [user]
  2. where datediff(month,create_day,getdate())=1

如果要效率,用一下方式

22,查询本周注册人数


 
 
  1. select count(*) from [user]
  2. where create_day>=dateadd(day,2-datepart(weekday,getdate()),convert(varchar,getdate(),112))
  3. and create_day <dateadd(day,9-datepart(weekday,getdate()),convert(varchar,getdate(),112))

23,上周注册人数 


 
 
  1. select count(*) from [user]
  2. where create_day>=dateadd(day,-5-datepart(weekday,getdate()),convert(varchar,getdate(),112))
  3. and create_day <dateadd(day,2-datepart(weekday,getdate()),convert(varchar,getdate(),112))

24,本月注册人数


 
 
  1. select count(*) from [user]
  2. where create_day>=dateadd(day,1-day(getdate()),convert(varchar,getdate(),112))
  3. and create_day <dateadd(month,1,dateadd(day,1-day(getdate()),convert(varchar,getdate(),112)))

25,上月注册人数


 
 
  1. select count(*) from [user]
  2. where create_day>=dateadd(month,-1,dateadd(day,1-day(getdate()),convert(varchar,getdate(),112)))
  3. and create_day <dateadd(day,1-day(getdate()),convert(varchar,getdate(),112))

26,本周


 
 
  1. select count(*) from User
  2. where datediff(dd,create_day,getdate()) <= datepart(dw,getdate())

27,上周


 
 
  1. select count(*) from User
  2. where datediff(dd,create_day,(getdate() - datepart(dw,getdate()))) <= 7

28,本月


 
 
  1. select count(*) from User
  2. where datepart(mm,create_day) = datepart(mm,getdate())

29,上月


 
 
  1. select count(*) from User
  2. where datepart(mm,create_day) = datepart(mm,getdate()) - 1

30,本周注册人数


 
 
  1. select count(*) from [User]
  2. where datediff(dd,create_day,getdate()) <= datepart(dw,getdate())

31,上周注册人数


 
 
  1. select count(*) from [User]
  2. where datediff(dd,create_day,(getdate() - datepart(dw,getdate()))) <= 7

32,本月注册人数


 
 
  1. select count(*) from [User]
  2. where datepart(mm,create_day) = datepart(mm,getdate())

33,上月注册人数


 
 
  1. select count(*) from [User]
  2. where datepart(mm,create_day) = datepart(mm,getdate()) - 1

34,查询今日所有

SELECT * from feedback WHERE (DATEDIFF(d,fedtime,GETDATE())=0) ORDER BY fedid DESC
 
 

月(create_day)=月(GETDATE())本月  

月(create_day)=月(getdate()) - 1上月

 

今天的所有数据:select * from Table name其中DateDiff(dd,datetime类型字段,getdate())= 0

昨天的所有数据:select * from Table name其中DateDiff(dd,datetime类型字段,getdate())= 1

7天内的所有数据:select * from Table name where DateDiff(dd,datetime类型字段,getdate())<= 7

30天内的所有数据:select * from Table name where DateDiff(dd,datetime类型字段,getdate())<= 30

本月的所有数据:select * from Table name其中DateDiff(mm,datetime类型字段,getdate())= 0

本年的所有数据:select * from Table name其中DateDiff(yy,datetime类型字段,getdate())= 0

 

 

系统函数:

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

 

参数interval的设定值:

缩写(Sql Server)访问和ASP说明
YYYYYY年1753〜9999
QQq季1~4
mmm月1〜12日
一年的一天dyy一年的日数,一年中的第几日1-366
DDd日,1-31
平日DWw 一周的日数,一周中的第几日1-7
WKWW周,一年中的第几周0~51
小时HHH时0~23
分钟Min分钟0~59
SSs秒0~59
毫秒Ms- 毫秒0~999

access和asp中用date()和now()取得系统日期时间;其中DateDiff,DateAdd,DatePart也同是能用于Access和asp中,这些函数的用法也类似

举例:

 


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

 

Sql取当天或当月的记录
表中的时间格式是这样的:2007-02-02 16:50:08.050,如果直接和当天的时间比较,就总得不到准确数据,但是我们可以把这种格式的时间[格式化]成2007-02-02,也就是只有年 - 月 - 日,然后把当天的时间也格式化成年 - 月 - 日的格式。
这样,思路就出来了!
我们格式化日期要用到转换()这个函数,要用到3个参数,首先来格式化当天的日期,转换(varchar(10),getDate(),120)
这样我们就可以把当天的日期格式化为:2007-2 -2,然后格式化数据库表中的日期
转换(VARCHAR(10),TimeFiled,120),最后我们就可以用一条的Sql语句得到当天的数据了。
例如:

转自网络

程序代码

选择*从VIEW_CountBill转换(varchar(10),[time],120)= Convert(varchar(10),getDate(),120)


注意:
转换()函数中的各个参数的意义,第一个参数,varchar(10)是目标系统所提供的数据类型,包括bigint和sql_variant。不能使用用户定义的数据类型。第二个参数是你要转换的字段,我这里是[时间]。最后一个就是格式了,这个值是可选的:20或者120都可以,它遵循的是[ODBC规范],输入/输出样式为:yyyy-mm- dd hh:mm:ss [.fff]
具体的可以参考Sql Server的联机帮助!

================================================== ====
T-Sql查找表中当月的记录
思路:将要查找的时间字段用Month()函数取出其中的月份,然后再取出当前月的月份,对比就OK了
例:

程序代码

选择*来自VIEW_CountBill其中月份([时间])=月份(getDate())

=================================================================================
sql语句获取本周、本月、本年数据

SQL Server
select * from [data] where DATEPART(m,[date])=2

Access
select * from [data] where DATEPART(‘m’,[date])=2

说明:
DATEPART(datepart,date)
返回表示指定日期的指定部分的整数
datepart 要取得的日期部分
- m 表示月份,d表示日,yyyy表示年
date 日期表达式

datediff(week,zy_time,getdate())=0 //查询本周

datediff(month,zy_time,getdate())=0 //查询本月

本季:select * from table where datediff(qq,C_CALLTIME,getdate())=0
前半年1-6,后半年7-12:select * from table where datepart(mm,C_CALLTIME)/7 = datepart(mm,getdate())/7

  1. 当前系统日期、时间
    select getdate()

  2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值
    例如:向日期加上2天
    select dateadd(day,2,‘2004-10-15’) --返回:2004-10-17 00:00:00.000

  3. datediff 返回跨两个指定日期的日期和时间边界数。
    select datediff(day,‘2004-09-01’,‘2004-09-18’) --返回:17

  4. datepart 返回代表指定日期的指定日期部分的整数。
    SELECT DATEPART(month, ‘2004-10-15’) --返回 10

  5. datename 返回代表指定日期的指定日期部分的字符串
    SELECT datename(weekday, ‘2004-10-15’) --返回:星期五

  6. day(), month(),year() --可以与datepart对照一下

select 当前日期=convert(varchar(10),getdate(),120)
,当前时间=convert(varchar(8),getdate(),114)

select datename(dw,‘2004-10-15’)

select 本年第多少周=datename(week,‘2004-10-15’)
,今天是周几=datename(weekday,‘2004-10-15’)

函数 参数/功能
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指定部分所对应的字符串名称

参数 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

access 和 asp 中用date()和now()取得系统日期时间;其中DateDiff,DateAdd,DatePart也同是能用于Access和asp中,这些函数的用法也类似

举例:
1.GetDate() 用于sql server :select GetDate()

2.DateDiff(‘s’,‘2005-07-20’,‘2005-7-25 22:56:32’)返回值为 514592 秒
DateDiff(‘d’,‘2005-07-20’,‘2005-7-25 22:56:32’)返回值为 5 天

3.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年

sql 查询本周本月问题
—求相差天数
select datediff(day,‘2004-01-01’,getdate())

–1.一个月第一天的
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

–2.本周的星期一
SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

select dateadd(wk,datediff(wk,0,getdate()),6)
–3.一年的第一天
SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

–4.季度的第一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

–5.当天的半夜
SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

–6.上个月的最后一天
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

–7.去年的最后一天
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

–8.本月的最后一天
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

–9.本年的最后一天
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

–10.本月的第一个星期一
select DATEADD(wk,
DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)

–查询本周注册人数
select count(*) from [user]
where datediff(week,create_day-1,getdate())=0

–上周注册人数
select count(*) from [user]
where datediff(week,create_day-1,getdate())=1

–本月注册人数
select count(*) from [user]
where datediff(month,create_day,getdate())=0

–上月注册人数
select count(*) from [user]
where datediff(month,create_day,getdate())=1

–如果要效率,这样写查询

–查询本周注册人数
select count(*) from [user]
where create_day>=dateadd(day,2-datepart(weekday,getdate()),convert(varchar,getdate(),112))
and create_day<dateadd(day,9-datepart(weekday,getdate()),convert(varchar,getdate(),112))

–上周注册人数
select count(*) from [user]
where create_day>=dateadd(day,-5-datepart(weekday,getdate()),convert(varchar,getdate(),112))
and create_day<dateadd(day,2-datepart(weekday,getdate()),convert(varchar,getdate(),112))

–本月注册人数
select count(*) from [user]
where create_day>=dateadd(day,1-day(getdate()),convert(varchar,getdate(),112))
and create_day<dateadd(month,1,dateadd(day,1-day(getdate()),convert(varchar,getdate(),112)))

–上月注册人数
select count(*) from [user]
where create_day>=dateadd(month,-1,dateadd(day,1-day(getdate()),convert(varchar,getdate(),112)))
and create_day<dateadd(day,1-day(getdate()),convert(varchar,getdate(),112))

–本周
select count(*) from User
where datediff(dd,create_day,getdate()) <= datepart(dw,getdate())

–上周
select count(*) from User
where datediff(dd,create_day,(getdate() - datepart(dw,getdate()))) <= 7

–本月
select count() from User
where datepart(mm,create_day) = datepart(mm,getdate())
–上月
select count(
) from User
where datepart(mm,create_day) = datepart(mm,getdate()) - 1
–本周
select count(*) from [User]
where datediff(dd,create_day,getdate()) <= datepart(dw,getdate())

–上周
select count(*) from [User]
where datediff(dd,create_day,(getdate() - datepart(dw,getdate()))) <= 7

–本月
select count() from [User]
where datepart(mm,create_day) = datepart(mm,getdate())
–上月
select count(
) from [User]
where datepart(mm,create_day) = datepart(mm,getdate()) - 1
学习
month(create_day)=month(getdate())本月
month(create_day)=month(getdate())-1 上月

补充 查询今日所有的
SELECT * from feedback WHERE (DATEDIFF(d,fedtime,GETDATE())=0) ORDER BY fedid DESC

一个access数据库查询例子:

SELECT app.appID AS 标识, app.appName AS 名称, auth.authCode AS 授权码, auth.authLength AS 授权时长, auth.userID AS 用户编号, auth.deviceID AS 设备编号, auth.authTime AS 授权日期, auth.authIs AS 授权否, DateAdd('h',auth.authLength,auth.authTime) AS 截止日期, DateDiff ('h',now(),截止日期) AS 到期状态
FROM app INNER JOIN auth ON app.appID=auth.appID;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值