国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

T-SQL: 15 個與日期時間相關的自定義函數(UDF),周日作為周的最后一天,均不受 @@Dat

2024-07-21 02:05:55
字體:
來源:轉載
供稿:網友
注冊會員,創建你的web開發資料庫,
/*
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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 克拉玛依市| 望江县| 渭南市| 奇台县| 榆中县| 达拉特旗| 禄丰县| 余庆县| 凌源市| 治多县| 平陆县| 西和县| 称多县| 乳源| 盐山县| 南宫市| 鸡东县| 闸北区| 康平县| 台湾省| 武隆县| 修武县| 隆安县| 沛县| 乡城县| 吉水县| 平顺县| 文登市| 曲麻莱县| 汾阳市| 长宁区| 新津县| 洛扎县| 威信县| 海原县| 绿春县| 邯郸县| 汤原县| 荥经县| 南宫市| 股票|