SQL 使用他们的出生日期计算距生日的天数
SQL Calculating day away from birthday using their DOB
我有一个关于根据出生日期查找生日的问题,遗憾的是我没有在这个网站上找到这个问题的答案。
我想要为距离生日还有 X 天的每个日期设置一个数字。除了我很难使用他们的 DOB 和 datediff。
我想要的:
John: 0 --Today his birthday
Eric:0
Ben:1 -- In this week
Jerry:1
Jules: 2 -- In this month
Tom: 3 -- all other dates
我试过将 DATEDIFF
与格式一起使用,但问题是您不能将格式与 DATEDIFF
一起使用。
我试过没有,这返回了他们的出生日期。
这是我试过的代码:
SELECT *
FROM
(SELECT
[id],
[fullname] = CONCAT(E.[name],
(CASE
WHEN LEN(E.[preposition]) > 0
THEN ' ' + E.[preposition]
END),
', ', E.[givenname]),
[relationnumber],
[day] = (CASE
WHEN DATEDIFF(day, [birthday], '2021-09-09') < 1
THEN 0
WHEN DATEDIFF(day, [birthday], '2021-09-09') < 8
THEN 1
WHEN DATEDIFF(day, [birthday], '2021-09-09') < 31
THEN 2
ELSE 3
END),
[birthday]
FROM
[info].[member] E
WHERE
[system_active] = 1) A
ORDER BY
day ASC
注意:我从URL
得到的设置日期'2021-09-09'
提前致谢
编辑
我的(有效)解决方案
SELECT *
FROM (
SELECT [id]
,[fullname] = CONCAT(E.[name], (CASE WHEN LEN(E.[preposition])>0 THEN ' '+E.[preposition] END), ', ', E.[givenname])
,[relationnumber]
,hi = DATEADD(year, DATEDIFF(year,[birthday], CAST('2021-09-09' as date)) , [birthday])
,[day] =
(
CASE
WHEN DATEDIFF(day, '2021-09-09', DATEADD(year, DATEDIFF(year,[birthday], CAST('2021-09-09' as date)) , [birthday])) = 0 THEN 0
WHEN DATEDIFF(day, '2021-09-09', DATEADD(year, DATEDIFF(year,[birthday], CAST('2021-09-09' as date)) , [birthday])) BETWEEN 1 AND 7 THEN 1
WHEN DATEDIFF(day, '2021-09-09', DATEADD(year, DATEDIFF(year,[birthday], CAST('2021-09-09' as date)) , [birthday])) BETWEEN 8 AND 31 THEN 2
ELSE 3
END
)
,[birthday]
FROM [info].[member] E
WHERE [system_active] = 1
) A
ORDER BY day ASC
要获得更好的答案,请查看 MatBailie 的答案。这个解决方案对我有用
DATEDIFF()
的一个特点是相差0表示值在同一day/week/month/year.
这意味着去年的任何日期总是与今年的任何其他日期相差 1 年。
DATEDIFF(year, '2020-01-01', '2021-09-09') == 1
DATEDIFF(year, '2020-12-31', '2021-09-09') == 1
它不计算日期之间的整年。它只计算年份部分的差异。
这意味着我遵循以下流程...
算出他们的下一个生日...
- 算出这个人今年的生日
- 如果那是在今天的日期之前,再增加一年
- 下一个生日是哪一天(把今天的生日当作下一个生日)
将其与固定日期进行比较...
- 他们的下一个生日是今天吗?
- 他们的下一个生日是在今天+7天之前吗?
- 他们的下一个生日是在今天+1个月之前吗?
我这样做如下...(修改后更容易参数化所有计算相对于的日期)
SELECT
member.*,
next.birthday AS next_birthday,
CASE WHEN next.birthday = today.date THEN 0
WHEN next.birthday <= DATEADD(DAY, 7, today.date) THEN 1
WHEN next.birthday <= DATEADD(MONTH, 1, today.date) THEN 2
ELSE 3
END
AS next_birthday_type
FROM
member
CROSS APPLY
(
SELECT CAST('2021-09-09' AS DATE)
)
today(date)
CROSS APPLY
(
SELECT DATEADD(year, DATEDIFF(year, member.birthday, today.date), member.birthday)
)
AS this_year(birthday)
CROSS APPLY
(
SELECT CASE WHEN this_year.birthday < today.date
THEN DATEADD(year, 1, this_year.birthday)
ELSE this_year.birthday
END
)
AS next(birthday)
演示:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=df444333bab146d4d923b210e813e852
我有一个关于根据出生日期查找生日的问题,遗憾的是我没有在这个网站上找到这个问题的答案。
我想要为距离生日还有 X 天的每个日期设置一个数字。除了我很难使用他们的 DOB 和 datediff。
我想要的:
John: 0 --Today his birthday
Eric:0
Ben:1 -- In this week
Jerry:1
Jules: 2 -- In this month
Tom: 3 -- all other dates
我试过将 DATEDIFF
与格式一起使用,但问题是您不能将格式与 DATEDIFF
一起使用。
我试过没有,这返回了他们的出生日期。
这是我试过的代码:
SELECT *
FROM
(SELECT
[id],
[fullname] = CONCAT(E.[name],
(CASE
WHEN LEN(E.[preposition]) > 0
THEN ' ' + E.[preposition]
END),
', ', E.[givenname]),
[relationnumber],
[day] = (CASE
WHEN DATEDIFF(day, [birthday], '2021-09-09') < 1
THEN 0
WHEN DATEDIFF(day, [birthday], '2021-09-09') < 8
THEN 1
WHEN DATEDIFF(day, [birthday], '2021-09-09') < 31
THEN 2
ELSE 3
END),
[birthday]
FROM
[info].[member] E
WHERE
[system_active] = 1) A
ORDER BY
day ASC
注意:我从URL
得到的设置日期'2021-09-09'提前致谢
编辑 我的(有效)解决方案
SELECT *
FROM (
SELECT [id]
,[fullname] = CONCAT(E.[name], (CASE WHEN LEN(E.[preposition])>0 THEN ' '+E.[preposition] END), ', ', E.[givenname])
,[relationnumber]
,hi = DATEADD(year, DATEDIFF(year,[birthday], CAST('2021-09-09' as date)) , [birthday])
,[day] =
(
CASE
WHEN DATEDIFF(day, '2021-09-09', DATEADD(year, DATEDIFF(year,[birthday], CAST('2021-09-09' as date)) , [birthday])) = 0 THEN 0
WHEN DATEDIFF(day, '2021-09-09', DATEADD(year, DATEDIFF(year,[birthday], CAST('2021-09-09' as date)) , [birthday])) BETWEEN 1 AND 7 THEN 1
WHEN DATEDIFF(day, '2021-09-09', DATEADD(year, DATEDIFF(year,[birthday], CAST('2021-09-09' as date)) , [birthday])) BETWEEN 8 AND 31 THEN 2
ELSE 3
END
)
,[birthday]
FROM [info].[member] E
WHERE [system_active] = 1
) A
ORDER BY day ASC
要获得更好的答案,请查看 MatBailie 的答案。这个解决方案对我有用
DATEDIFF()
的一个特点是相差0表示值在同一day/week/month/year.
这意味着去年的任何日期总是与今年的任何其他日期相差 1 年。
DATEDIFF(year, '2020-01-01', '2021-09-09') == 1
DATEDIFF(year, '2020-12-31', '2021-09-09') == 1
它不计算日期之间的整年。它只计算年份部分的差异。
这意味着我遵循以下流程...
算出他们的下一个生日...
- 算出这个人今年的生日
- 如果那是在今天的日期之前,再增加一年
- 下一个生日是哪一天(把今天的生日当作下一个生日)
将其与固定日期进行比较...
- 他们的下一个生日是今天吗?
- 他们的下一个生日是在今天+7天之前吗?
- 他们的下一个生日是在今天+1个月之前吗?
我这样做如下...(修改后更容易参数化所有计算相对于的日期)
SELECT
member.*,
next.birthday AS next_birthday,
CASE WHEN next.birthday = today.date THEN 0
WHEN next.birthday <= DATEADD(DAY, 7, today.date) THEN 1
WHEN next.birthday <= DATEADD(MONTH, 1, today.date) THEN 2
ELSE 3
END
AS next_birthday_type
FROM
member
CROSS APPLY
(
SELECT CAST('2021-09-09' AS DATE)
)
today(date)
CROSS APPLY
(
SELECT DATEADD(year, DATEDIFF(year, member.birthday, today.date), member.birthday)
)
AS this_year(birthday)
CROSS APPLY
(
SELECT CASE WHEN this_year.birthday < today.date
THEN DATEADD(year, 1, this_year.birthday)
ELSE this_year.birthday
END
)
AS next(birthday)
演示:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=df444333bab146d4d923b210e813e852