求日期所屬星座的 T-SQL UDF (使用者自訂函數)

來源:互聯網
上載者:User

use northwind
go
create function udf_GetStar (@ datetime)
returns varchar(100)
-- 返回日期所屬星座,如果有靜態 星座對照碼錶 直接在查詢中 join 效率相對更高
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 [month] * 40 + [day]
=
(
select max([month] * 40 + [day])
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 [month] * 40 + [day] <= month(@) * 40 + day(@)
)
)
end
go
CREATE FUNCTION GetStar1(@ datetime)
RETURNS varchar(100)
AS
BEGIN
--僅一句 SQL 搞定
--如果有靜態 星座對照碼錶 直接在查詢中 join 效率相對更高
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(day,[day]-1,dateadd(month,[month]-1,dateadd(year,datediff(year,0,@),0)))
=
(
select max(dateadd(day,[day]-1,dateadd(month,[month]-1,dateadd(year,datediff(year,0,@),0))))
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(day,[day]-1,dateadd(month,[month]-1,dateadd(year,datediff(year,0,@),0)))
)
)
end

go

declare @ datetime
set @ = getdate()

select *
from stars
where [month] * 40 + [day] =
(
select max(stars.[month] * 40 + stars.[day])
from stars
where stars.[month] * 40 + stars.[day] <= month(@) * 40 + day(@)
)

go
select c.birthdate,a.star
from employees c
left join stars a
on month(c.birthdate) * 40 + day(c.birthdate) >= a.month * 40 + a.day
left join stars b
on a.month * 40 + a.day < b.month * 40 + b.day
and b.month * 40 + b.day  = (select min(month * 40 + day) from stars where month * 40 + day > a.month * 40 + a.day)
where month(c.birthdate) * 40 + day(c.birthdate) < isnull(b.month * 40 + b.day,999)

select *
from stars a
left join stars b
on a.month * 40 + a.day < b.month * 40 + b.day
and b.month * 40 + b.day  = (select min(month * 40 + day) from stars where month * 40 + day > a.month * 40 + a.day)

select a.birthdate,b.star,dbo.udf_getstar1(a.birthdate),dbo.udf_getstar(a.birthdate)
from employees a
left join
(
select a.*,isnull(b.month,12) as m,isnull(b.day,31) as d
from stars a
left join stars b
on a.month * 40 + a.day < b.month * 40 + b.day
and b.month * 40 + b.day  = (select min(month * 40 + day) from stars where month * 40 + day > a.month * 40 + a.day)
) b
on month(a.birthdate) * 40 + day(a.birthdate) >= b.month * 40 +  b.day
and month(a.birthdate) * 40 + day(a.birthdate) < b.m * 40 +  b.d

select e.birthdate,a.star
from employees e
left join stars a
on month(e.birthdate) * 40 + day(e.birthdate) >= a.month * 40 + a.day
left join stars b
on a.month * 40 + a.day < b.month * 40 + b.day
and b.month * 40 + b.day  = (select min(month * 40 + day) from stars where month * 40 + day > a.month * 40 + a.day)
where month(e.birthdate) * 40 + day(e.birthdate) < isnull(b.month * 40 + b.day,999)
go

--測試
use northwind
select dbo.getstar(birthdate),count(*)
from employees
group by dbo.getstar(birthdate)

create  function Weekday(@Date datetime)
returns integer
begin
--1: Monday , ... ,7: Sunday
return (select (@@datefirst + datepart(weekday,@Date)) % 7
        + case when (@@datefirst + datepart(weekday,@Date)) % 7 < 2
                    then 6
               else -1
          end)
end

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.