Sql Server日期时间处理函数
来源:互联网 发布:二叉树中序遍历算法 编辑:程序博客网 时间:2024/05/05 13:29
/**//**//* datepart()函数的使用
* datepart()函数可以方便的取到时期中的各个部分
*如日期:2006-07--02 18:15:36.513
* yy:取年 2006
* mm:取月 7
* dd:取月中的天 2
* dy:取年中的天 183
* wk:取年中的周 27
* dw:取周中的天 1
* qq:取年中的季度 3
* hh:取小时 18
* mi:取分钟 15
* ss:取秒 36
* 以下简单的语句可以演示所取到的结果
*/
select getdate()
select datepart(mm,getdate())
select datepart(yy,getDate())
select datepart(dd,getdate())
select datepart(dy,getdate())
select datepart(wk,getdate())
select datepart(dw,getdate())
select datepart(qq,getdate())
select datepart(hh,getdate())
select datepart(mi,getdate())
select datepart(ss,getdate())
select datediff(dd,getdate(),'12/25/2006')--计算从今天到12/25/2006还有多少天
select datediff(mm,getdate(),'12/25/2006')--计算从今天到12/25/2006还有多少个月
select datename(mm,getdate()) --以字符串而不是数字的形式得到今天的月份(07)
select dateadd(dd,30,getdate()) --在目前的日期日期上加30天
select dateadd(mm,3,getdate()) --在目前的日期日期上加3个月
select dateadd(yy,1,getdate()) --在目前的日期日期上加1年
select DATEADD(qq,DATEDIFF(qq,0,getdate()), 0)--得到本季度第一天
select dateadd(mm,-3,DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)) --得到上主、季度第一天
select convert(varchar(10),getdate(),120)--结果2007-05-26
/**//*
说明 varchar(10)为截取长度为10个字符
getdate()是需要处理的日期,也可以直接给日期字符串
如:2007-05-26 10:00:28.420
120:为getdate()的格式具体可参看以下列表
参数 结果
100 05 8 2006 9:27PM
101 05/08/2006
102 2006.05.08
103 08/05/2006
104 08.05.2006
105 08-05-2006
106 08 05 2006
107 05 08, 2006
108 21:30:51
109 05 8 2006 9:31:11
110 05-08-2006
111 2006/05/08
112 20060508
113 08 05 2006 21:31:59
114 21:33:06:503
120 2006-05-08 21:33:38
*/
/*
T-SQL: 15 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响
都是从老文章里收集或提炼出来的!
提示:
(@@Datefirst + datepart(weekday,@Date)) % 7 判断周几是最保险的! 与 @@DateFirst 无关,与语言版本无关
@@DateFirst 可能会导致 datepart(weekday,@Date) 不一样!
无论 @@DateFirst 等于几,无论是什么语言版本的 SQL Server 下面永远恒成立!
(@@Datefirst + datepart(weekday,@Date)): 2、3、4、5、6、0、1 分别代表 周一 到 周日
-- */
create function udf_GetAge(@StartDate datetime,@EndDate datetime)
returns integer
-- 返回精确年龄 select dbo.udf_GetAge('1949-10-01',getdate())
begin
return datediff(year,@StartDate,@EndDate)
- case when datediff(day,dateadd(year,datediff(year,@StartDate,@EndDate),@StartDate),@EndDate) >= 0
then 0
else
1
end
end
go
create function udf_DaysOfYearByDate(@Date datetime)
RETURNS integer
-- 返回年的天数 可判断 平(365)、润(366) 年
begin
return datediff(day,dateadd(year,datediff(year,0,@Date),0),dateadd(year,datediff(year,0,@Date )+1,0))
end
go
create function udf_DaysOfYear(@Year integer)
RETURNS integer
-- 返回年的天数 可判断 平(365)、润(366) 年
begin
return datediff(day,dateadd(year,@year - year(0),0),dateadd(year,@year - year(0) + 1,0))
end
go
create function udf_HalfDay(@Date datetime)
returns datetime
-- 返回 @Date 是 上午 返回 @Date 的零点,@Date 是 下午 返回 @Date 的十二点
as
begin
return case when datepart(hour,@Date) < 12
then dateadd(day,datediff(day,0,@Date),0) --上午归到 零点
else
dateadd(hour,12,dateadd(day,datediff(day,0,@Date),0)) --下午归到 十二点
end
end
go
create function udf_WeekDiff(@StartDate datetime,@EndDate datetime)
returns integer
-- 返回 [@StartDate , @EndDate] 之间周数 周日是当周的最后一天
begin
return datediff(week,@StartDate,@EndDate) -- + 1
+ case when (@@Datefirst + datepart(weekday,@StartDate)) % 7 = 1
then 1
else
0
end
- case when (@@Datefirst + datepart(weekday,@EndDate)) % 7 = 1
then 1
else 0
end
end
go
create function udf_WeekOfMonth(@Date datetime)
-- 返回 @Date 是所在月的第几周 周日是当周的最后一天
returns integer
as
begin
return datediff(week
,case when (@@Datefirst + datepart(weekday,dateadd(month,datediff(month,0,@Date),0))) % 7 = 1
then dateadd(month,datediff(month,0,@Date),0) - 1
else
dateadd(month,datediff(month,0,@Date),0)
end
,case when (@@Datefirst + datepart(weekday,@Date)) % 7 = 1
then @Date-1
else @Date
end
) + 1
end
go
create function udf_WeekOfQuarter(@Date datetime)
-- 返回 @Date 是所在季度的第几周 周日是当周的最后一天
returns int
as
begin
return datediff(week
,case when (@@Datefirst + datepart(weekday,dateadd(Quarter,datediff(Quarter,0,@Date),0))) % 7 = 1
then dateadd(Quarter,datediff(Quarter,0,@Date),0) - 1
else
dateadd(Quarter,datediff(Quarter,0,@Date),0)
end
,case when (@@Datefirst + datepart(weekday,@Date)) % 7 = 1
then @Date - 1
else
@Date
end
) + 1
end
go
create function udf_WeekOfYear(@Date datetime)
-- 返回 @Date 是所在年的第几周 周日是当周的最后一天
returns int
as
begin
return datediff(week
,case when (@@Datefirst + datepart(weekday,dateadd(day,0,datediff(day,0,dateadd(year,datediff(year,0,@Date),0))))) % 7 = 1
then dateadd(day,-1,dateadd(day,0,datediff(day,0,dateadd(year,datediff(year,0,@Date),0))))
else
dateadd(day,0,datediff(day,0,dateadd(year,datediff(year,0,@Date),0))) --date 所在年的第一天 即: 一月一号
end
,case when (@@Datefirst + datepart(weekday,@Date)) % 7 = 1
then dateadd(day,-1,@Date)
else
@Date
end
) + 1
end
go
create function udf_WeekDay(@ int,@Date datetime)
returns datetime
-- 返回 @Date 映射到 所在周的其他天 周日是当周的最后一天
begin
/*
--周日算作(上一)周的最后一天
当 @ <= 1 代表将 @Date 映射到 所在周的星期一
当 @ = 2 代表将 @Date 映射到 所在周的星期二
当 @ = 3 代表将 @Date 映射到 所在周的星期三
当 @ = 4 代表将 @Date 映射到 所在周的星期四
当 @ = 5 代表将 @Date 映射到 所在周的星期五
当 @ = 6 代表将 @Date 映射到 所在周的星期六
当 @ >= 7 代表将 @Date 映射到 所在周的星期日
可用于按周汇总 Group by,均支持跨年跨月数据
*/
return dateadd(day
,case when (@@Datefirst + datepart(weekday,@Date)) % 7 = 0 --周六
then case when @ between 1 and 6
then @ - 6
else
1
end
when (@@Datefirst + datepart(weekday,@Date)) % 7 = 1 --周日(七)
then case when @ between 1 and 6
then @ - 7
else
0
end
when (@@Datefirst + datepart(weekday,@Date)) % 7 between 2 and 6 --周一至周五
then case when @ between 1 and 6
then @ + 1 - (@@Datefirst + datepart(weekday,@Date)) % 7
else
8 - (@@Datefirst + datepart(weekday,@Date)) % 7
end
end
,@Date)
end
go
create function udf_WeekdayDiff(@Weekday integer,@StartDate datetime,@EndDate datetime)
returns integer
--返回 [@StartDate , @EndDate] 之间周一 到 周日的个数 周日是当周的最后一天
begin
-- @Weekday: 1: Monday , ... ,7: Sunday
return datediff(week,@StartDate,@EndDate)
+ case when (@@Datefirst + datepart(weekday,@StartDate)) % 7
+ case when (@@Datefirst + datepart(weekday,@StartDate)) % 7 = 0
then 7
else
0
end > @Weekday % 7 + 1
then 0
else 1
end
- case when (@@Datefirst + datepart(weekday,@EndDate)) % 7
+ case when (@@Datefirst + datepart(weekday,@EndDate)) % 7 = 0
then 7
else 0
end >= @Weekday % 7 + 1
then
0
else
1
end
/* test:
declare @b datetime
declare @e datetime
set @b = '2004-01-29'
set @e = '2004-09-05'
select @b as BeginDate ,@e as EndDate
,dbo.udf_WeekdayDiff(1,@b,@e) as CountOfMonday
,dbo.udf_WeekdayDiff(2,@b,@e) as CountOfTuesday
,dbo.udf_WeekdayDiff(3,@b,@e) as CountOfWednesday
,dbo.udf_WeekdayDiff(4,@b,@e) as CountOfThursday
,dbo.udf_WeekdayDiff(5,@b,@e) as CountOfFriday
,dbo.udf_WeekdayDiff(6,@b,@e) as CountOfSaturday
,dbo.udf_WeekdayDiff(7,@b,@e) as CountOfSunday
*/
end
go
create function udf_WeekdayID(@Date datetime)
returns integer
-- 返回 @Date 是 Monday 返回 1, ... ,是 Sunday 返回 1
begin
--1: Monday , ... ,7: Sunday
return (@@Datefirst + datepart(weekday,@Date)) % 7
+ case when (@@Datefirst + datepart(weekday,@Date)) % 7 < 2
then 6
else
-1
end
end
go
create function udf_NextWorkDate(@Date datetime)
returns datetime
-- 返回 @Date 的下一个工作日
begin
/*
declare @i int
set @i = 3
declare @Date datetime
set @Date = '2005-01-02'
-- */
return case when (@@Datefirst + datepart(weekday,@Date)) % 7 = 6 -- Friday
then dateadd(day,3,@Date)
when (@@Datefirst + datepart(weekday,@Date)) % 7 = 0 -- saturday
then dateadd(day,2,@Date)
else
dateadd(day,1,@Date)
end
end
go
create function udf_PreviousWorkDate(@Date datetime)
returns datetime
-- 返回 @Date 的上一个工作日
begin
/*
declare @i int
set @i = 3
declare @Date datetime
set @Date = '2005-01-02'
-- */
return case when (@@Datefirst + datepart(weekday,@Date)) % 7 = 2 -- Monday
then dateadd(day,-3,@Date)
when (@@Datefirst + datepart(weekday,@Date)) % 7 = 1 -- Sunday
then dateadd(day,-2,@Date)
else
dateadd(day,-1,@Date)
end
end
go
create function udf_WorkDateAdd(@i integer,@Date datetime)
returns datetime
-- 返回 @Date 加上一段 @i 个工作日的新值
begin
declare @ int
set @ = 0
while @ < abs(@i)
begin
set @Date = case when @i >= 0
then --dbo.udf_nextworkdate(@Date)
case when (@@Datefirst + datepart(weekday,@Date)) % 7 = 6 -- Friday
then dateadd(day,3,@Date)
when (@@Datefirst + datepart(weekday,@Date)) % 7 = 0 -- saturday
then dateadd(day,2,@Date)
else
dateadd(day,1,@Date)
end
else
--dbo.udf_previousworkdate(@Date)
case when (@@Datefirst + datepart(weekday,@Date)) % 7 = 2 -- Monday
then dateadd(day,-3,@Date)
when (@@Datefirst + datepart(weekday,@Date)) % 7 = 1 -- Sunday
then dateadd(day,-2,@Date)
else
dateadd(day,-1,@Date)
end
end
set @ = @ + 1
end
return @Date
end
go
create function udf_GetStar (@ datetime)
RETURNS varchar(100)
-- 返回日期所属星座
BEGIN
RETURN
(
--declare @ datetime
--set @ = getdate()
select max(star)
from
(
select '魔羯座' as star,1 as [month],1 as [day]
union all select '水瓶座',1,20
union all select '双鱼座',2,19
union all select '牡羊座',3,21
union all select '金牛座',4,20
union all select '双子座',5,21
union all select '巨蟹座',6,22
union all select '狮子座',7,23
union all select '处女座',8,23
union all select '天秤座',9,23
union all select '天蝎座',10,24
union all select '射手座',11,22
union all select '魔羯座',12,22
) stars
where dateadd(month,[month] - 1,dateadd(year,year(@) - year(0),0)) + [day] - 1 =
(
select max(dateadd(month,[month] - 1,dateadd(year,year(@) - year(0),0)) + [day] - 1)
from (
select '魔羯座' as star,1 as [month],1 as [day]
union all select '水瓶座',1,20
union all select '双鱼座',2,19
union all select '牡羊座',3,21
union all select '金牛座',4,20
union all select '双子座',5,21
union all select '巨蟹座',6,22
union all select '狮子座',7,23
union all select '处女座',8,23
union all select '天秤座',9,23
union all select '天蝎座',10,24
union all select '射手座',11,22
union all select '魔羯座',12,22
) stars
where @ >= dateadd(month,[month] - 1,dateadd(year,year(@) - year(0),0)) + [day] - 1
)
)
end
- SQL SERVER时间日期处理函数!
- Sql Server日期时间处理函数
- SQL SERVER 时间日期处理函数
- sql server日期时间函数
- sql server日期时间函数
- sql server日期时间函数
- sql server日期时间函数
- sql server日期时间函数
- sql server日期时间函数
- sql server日期时间函数
- sql server日期时间函数
- sql server日期时间函数
- sql server日期时间函数
- sql server日期时间函数
- sql server日期时间函数
- sql server日期时间函数
- sql server日期时间函数
- sql server日期时间函数
- 清华园畅谈口袋科技创想,TI首席科学家展望SoC时代演进蓝图
- 给系统管理员的一本好书
- poj 1690 (Your)((Term)((Project)))
- Pointers to Functions 函数指针
- 异步
- Sql Server日期时间处理函数
- 用ASP 写的页码函数,跟淘宝一样滴页码哦, 12....45678.....100 101 102 这种
- 较高版本的U-BOOT中添加命令
- 线程安全详解及相关实用技巧
- 感觉到中国的强大
- 树形结构在开发中的应用
- 12种公认的减肥食品
- .NET平台下Web树形结构程序设计
- 山寨手机的市场