SQL 月初月末 排除临界 无BUG 日期大全 日期差

select   dateadd(dd,-day(dateadd(month,-1,getdate()))+1,dateadd(month,-1,getdate()))     /*上个月一号*/
select   dateadd(dd,-day(getdate()),getdate())                                                                      /* 上月月底 */
select   dateadd(dd,-day(getdate())+1,getdate())                                                                  /* 本月一号 */
select   dateadd(dd,-day(dateadd(month,1,getdate())),dateadd(month,1,getdate()))            /* 本月底 */
select   dateadd(dd,-day(dateadd(month,1,getdate()))+1,dateadd(month,1,getdate()))        /* 下月一号 */
select   dateadd(dd,-day(dateadd(month,2,getdate())),dateadd(month,2,getdate()))            /* 下月月底 */

--------------------------------------------------------------------------------

DECLARE @a DATETIME
SET @a='2009-07-8 13:24:09.437'
select @a as '当前日期',
DateName(year,@a) as '年',
DateName(month,@a) as '月',
DateName(day,@a) as '日',
DateName(dw,@a) as '星期',
DateName(week,@a) as '周数',
DateName(hour,@a) as '时',
DateName(minute,@a) as '分',
DateName(second,@a) as '秒'

 

 

--------------------------------------------------------------------------------

递归法查询一年的所有天数

1.

WITH Dates AS
 ( SELECT [Date] = CONVERT(DATETIME,'01/01/2011')
UNION ALL
 SELECT [Date] = DATEADD(DAY, 1, [Date]) FROM Dates WHERE Date  < '12/31/2011' )
  SELECT [Date],DATENAME(YEAR,date)AS 年,DATENAME(month,date)AS 月,DATENAME(day,date)AS 日,DATENAME(dw,date)AS 星期,DATENAME(week,date)AS 周数 FROM Dates OPTION (MAXRECURSION 366)
2.

WITH CTEDates AS ( SELECT CAST('20070101' AS DATETIME) AS DateVal UNION ALL SELECT DATEADD(dd, 1, DateVal) FROM CTEDates WHERE DateVal < '20071231' ) SELECT DateVal, 0,0,0,0,0,0,0,0,0 FROM CTEDates OPTION  (MAXRECURSION 366)

 

-------------------------------------------------------------------------------------

//按自然周统计
select to_char(date,'iw'),sum()
from
where
group by to_char(date,'iw')

//按自然月统计
select to_char(date,'mm'),sum()
from
where
group by to_char(date,'mm')

//按季统计
select to_char(date,'q'),sum()
from
where
group by to_char(date,'q')

//按年统计
select to_char(date,'yyyy'),sum()
from
where
group by to_char(date,'yyyy')
------------------------------------------------------------------------

DateDiff 函数


返回 Variant (Long) 的值,表示两个指定日期间的时间间隔数目。

语法

DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])

DateDiff 函数语法中有下列命名参数:

部分 描述
interval 必要。字符串表达式,表示用来计算date1 和 date2 的时间差的时间间隔
Date1□date2 必要;Variant (Date)。计算中要用到的两个日期。
Firstdayofweek 可选。指定一个星期的第一天的常数。如果未予指定,则以星期日为第一天。
firstweekofyear 可选。指定一年的第一周的常数。如果未予指定,则以包含 1 月 1 日的星期为第一周。


设置

interval 参数的设定值如下:

设置 描述
yyyy 年
q 季
m 月
y 一年的日数
d 日
w 一周的日数
ww 周
h 时
n 分钟
s 秒


firstdayofweek 参数的设定值如下:

常数 值 描述
vbUseSystem 0 使用 NLS API 设置。
vbSunday 1 星期日(缺省值)
vbMonday 2 星期一
vbTuesday 3 星期二
vbWednesday 4 星期三
vbThursday 5 星期四
vbFriday 6 星期五
vbSaturday 7 星期六

常数 值 描述
vbUseSystem 0 用 NLS API 设置。
vbFirstJan1 1 从包含 1 月 1 日的星期开始(缺省值)。
vbFirstFourDays 2 从第一个其大半个星期在新的一年的一周开始。
vbFirstFullWeek 3 从第一个无跨年度的星期开始。

 

----------------------------------------------------------------------------------

 

本周的星期一 :SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)   
一年的第一天 :SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
季度的第一天 :SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)  
本月最后一天:select   dateadd(dd,-day(getdate()),dateadd(m,1,getdate()))
上个月一号:select   dateadd(dd,-day(dateadd(month,-1,getdate()))+1,dateadd(month,-1,getdate()))  
上月月底:select   dateadd(dd,-day(getdate()),getdate())                                                           本月一号select   dateadd(dd,-day(getdate())+1,getdate())                                                          
本月底:select   dateadd(dd,-day(dateadd(month,1,getdate())),dateadd(month,1,getdate()))
下月一号:select   dateadd(dd,-day(dateadd(month,1,getdate()))+1,dateadd(month,1,getdate()))
下月月底:select   dateadd(dd,-day(dateadd(month,2,getdate())),dateadd(month,2,getdate()))
------------------------------------------------------------------------------------------------

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值