【问题标题】:SQL Calculating day away from birthday using their DOBSQL使用他们的出生日期计算离生日的日子
【发布时间】:2021-11-05 22:31:39
【问题描述】:

我有一个关于根据出生日期查找生日的问题,遗憾的是我在这个网站上没有找到答案。

我希望为距离他们生日还有 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 的答案。这个解决方案对我有用

【问题讨论】:

  • 您的代码假定birthday 是“今年”。您是否已经有一个流程可以在他们每次过生日时更新这些日期? (所以 Fred 可能出生于 1998-02-28,但 birthday 列将具有 2022-02-28?) 如果是这样,那么 birthday 何时更新? (在他们生日那天的开始,在他们生日的最后一天,在他们生日的一周结束时)?或者,birthday 实际上是 date-of-birth 列,而 year 部分通常在过去很远?
  • 生日是他们出生的那一天,这个栏目不会更新
  • 当你说this weekthis month时,正是做什么> 什么意思?对于this week,您可以表示“在接下来的 7 天内”或“在前 7 天内”,或者将“工作周”或“日历周”视为周一至周日,并且您想要知道“今天”和“生日”是否在同一个“工作周”......
  • 在接下来的 x 天内,一周内:今天是第 9 天。我想要从 9 日到 15 日过生日的每一个人。
  • 一周多,也就是8天。 “月”是什么意思?

标签: sql sql-server tsql datediff


【解决方案1】:

DATEDIFF() 的一个特点是差值为 0 表示值在同一天/周/月/年。

这意味着去年的任何日期总是与今年的任何其他日期相距 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多