【问题标题】:Getting multiple celebrations falling on same date - sql server在同一日期举行多个庆祝活动 - sql server
【发布时间】:2014-05-26 13:14:34
【问题描述】:

我在 sql server 中有一个员工数据源,我需要从中检索符合以下任一条件的员工的列表

  1. 他们的加入日期
  2. 他们的结婚日期
  3. 他们的出生日期

每条员工记录都有上述信息。基于这些条件,我需要在查询中连接一个字符串,如

  • 如果员工“A”今天过生日,我需要显示“生日快乐 A”
  • 如果员工“B”今天庆祝周年,我需要显示“Happy Anniversary B”

我是编写 sql 查询的新手,我已经尝试过了。

select CONCAT(given_name,' ',sur_name) as name,
      photo_link,birth_date,join_date,wedding_date 
  FROM emp_db where (DATEPART(dd,birth_date) = DATEPART(dd,getdate())
                 OR DATEPART(dd,join_date) = DATEPART(dd,getdate()) 
                 OR DATEPART(dd,wedding_date) = DATEPART(dd,getdate())) 
                AND status = 'employed' 
  ORDER BY Day(birth_date), Day(join_date), Day(wedding_date)"

有人可以为此提出一个好的解决方案吗?

【问题讨论】:

    标签: php sql sql-server database


    【解决方案1】:

    我认为您需要一个 UNION。这与您的要求略有不同,因为当且仅当他们在同一天庆祝多个事件时,它将为同一员工提供多个记录。像这样的:

    (
      SELECT *, birth_date AS celebration_date, CONCAT('Happy birthday, ',given_name,' ',sur_name) AS celebration_message,
      FROM emp_db WHERE DATEPART(dd,birth_date) = DATEPART(dd,getdate()) AND DATEPART(mm,birth_date) = DATEPART(mm,getdate())
    ) UNION (
      SELECT *, wedding_date AS celebration_date, CONCAT('Happy anniversary, ',given_name,' ',sur_name) AS celebration_message,
      FROM emp_db WHERE DATEPART(dd,wedding_date) = DATEPART(dd,getdate()) AND DATEPART(mm,wedding_date) = DATEPART(mm,getdate())
    ) UNION (
      SELECT *, join_date AS celebration_date, CONCAT('Happy work anniversary, ',given_name,' ',sur_name) AS celebration_message,
      FROM emp_db WHERE DATEPART(dd,join_date) = DATEPART(dd,getdate()) AND DATEPART(mm,join_date) = DATEPART(mm,getdate())
    )
    

    【讨论】:

    • DatePart 只给出日期的一部分。所以说在 11 月 11 日过生日的人也会在 4 月 11 日生日快乐
    • 谢谢。我纠正了它......但谁知道呢?也许他确实想每月与他的员工一起庆祝:)
    • @Frazz 如果我拥有一家公司,我愿意每月与我的员工一起庆祝 :)
    【解决方案2】:

    请试一试

    select case  
    when 
       ( convert(varchar(10),ondate,103) = convert(varchar(10),getdate(),103 ) and  CelebrateType='Birthday' ) 
       then  ('Happy Bithday '+ UserName ) 
    
       when ( convert(varchar(10),ondate,103) = convert(varchar(10),getdate(),103 ) and  CelebrateType='Anniversary ' ) 
       then  ('Happy Aniversary '+ UserName ) 
    
        when ( convert(varchar(10),ondate,103) = convert(varchar(10),getdate(),103 ) and  CelebrateType='Joining' ) 
       then  ('Happy joining '+ UserName )    
     end  as Congretecolumnn
    
     from TableName  
     where convert(varchar(10),ondate,103)= convert(varchar(10),getdate(),103)  
    

    【讨论】:

      【解决方案3】:

      您的查询将返回正确的记录,但您不知道哪个条件为真。
      即,您不知道他们出现在您的结果中是因为这是他们的生日,还是因为这是他们的周年纪念日……,

      您可以检查每个结果日期以查看哪些是“命中”,或者您可以让您的查询进行。

      我认为你想使用 dayofyear,而不是 datepart('dd') 将返回的月份中的某一天,我认为你也可以使用 datepart('dy')

      SELECT CONCAT(given_name,' ',sur_name) AS name, photo_link,
        IF ( DAYOFYEAR(birth_date) =  DAYOFYEAR(getdate()),'Birthday',NULL) AS birthday
        IF ( DAYOFYEAR(join_date) =  DAYOFYEAR(getdate()),'Joined',NULL) AS joined,
        IF (  DAYOFYEAR(wedding_date) =  DAYOFYEAR(getdate()), 'Wedding', NULL) AS wedding, 
        FROM emp_db WHERE ( DAYOFYEAR(birth_date) =  DAYOFYEAR(getdate())
                   OR ( DAYOFYEAR(join_date) =  DAYOFYEAR(getdate()) 
                   OR ( DAYOFYEAR(wedding_date) =  DAYOFYEAR(getdate()) 
                  AND (status = 'employed') 
        ORDER BY Day(birth_date), Day(join_date), Day(wedding_date)
      

      然后通常的做法是遍历您的查询结果并根据需要显示每一行。

      还要考虑员工可以在同一天加入/结婚/出生的情况。

       while ($row = $result->fetch_assoc()){
           if ($row['birthday'])  $txt .= 'Happy Birthday, '.$row['name']."\n";
           if ($row['joined'])  $txt .= 'Happy Work Anniversary, '.$row['name']."\n";
           if ($row['wedding'])  $txt .= 'Happy Wedding Anniversary, '.$row['name']."\n";
       }
      

      【讨论】:

      • 谢谢@Loopo。你能解释一下这条线的作用吗 IF ( DAYOFYEAR(birth_date) = DAYOFYEAR(getdate()),'Birthday',NULL)
      • DAYOFYEAR 会给您带来问题......在闰年从三月到十二月的所有日子里,DAYOFYEAR 都与非闰年不同。顺便说一句,你不应该使用 getdate()... 除非你想抨击那些出于某种原因想要庆祝 2 月 29 日的不幸的少数人。
      猜你喜欢
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 2019-05-14
      • 2022-12-02
      • 2011-04-13
      • 1970-01-01
      • 2016-01-02
      • 2014-05-05
      相关资源
      最近更新 更多