T-SQL: 17 个与日期时间相关的自定义函数(UDF)

80酷酷网    80kuku.com

  函数|函数/*
T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 DateFirst、语言版本影响
都是从老文章里收集或提炼出来的!
提示:
(Datefirst + datepart(weekday,Date)) % 7 判断周几是最保险的! 与 DateFirst 无关,与语言版本无关
DateFirst 可能会导致 datepart(weekday,Date) 不一样!
无论 DateFirst 等于几,无论是什么语言版本的 SQL Server 下面永远恒成立!
(Datefirst + datepart(weekday,Date))%7 : 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 的十二点
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
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
              &n

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: