年度包装于2013-12-31

时间:2013-12-03 22:00:48

标签: sql

考虑今天是2013-12-31的情况,但客户的生日是在2014-01-01 第一个谓词将返回2013-01-01,下一个谓词在接下来的7天范围内将不匹配。我该如何解决这个问题? 谢谢

 select c.CustomerCode AS 会员ID, c.LastName || ' ' ||  c.FirstName AS 姓名, c.MobilePhoneNumber AS 手机号码 from 
   customer  c 
   where  

  { fn  TRIM(CAST(CAST(YEAR(CURRENT_DATE) AS CHAR(4)) AS VARCHAR(4)))} || '-' ||
  { fn TRIM(CAST(CAST(MONTH(c.DOB)  AS CHAR(2)) AS VARCHAR(2))) } || '-' ||
  { fn TRIM(CAST(CAST(DAY(c.DOB) AS CHAR(2)) AS VARCHAR(2))) }
       BETWEEN cast({ fn DATE(CURRENT_DATE) } as date)   
     AND cast ({ fn  TIMESTAMPADD(SQL_TSI_DAY,  +7 ,   CURRENT_DATE) } as date)   
         group by c.CustomerCode, c.LastName, c.FirstName, c.MobilePhoneNumber";

1 个答案:

答案 0 :(得分:3)

您假设下一个生日是在当前日历年。没有必要做出这样的假设。您还假设当前日历年中存在月/日组合,这不一定是真的,因为生日可能是2月29日。

这两个都可以轻松避免。取YEAR(CURRENT_DATE)YEAR(DOB)之间的差异。假设是18岁。现在将DOB增加18年(可能会将2月29日更改为一年中的另一个日期),并且您已经为客户提供了今年的生日。将其与CURRENT_DATE进行比较。如果是早些时候,生日已经过去,下一个生日实际上是DOB之后的18 + 1年。如果是晚些时候,生日还没有结束,你已经有了下一个生日。

现在您确定了下一个生日,您可以在CURRENT_DATE之间取得差异。

请注意,在此过程中没有任何地方需要将日期作为字符串进行操作。

有关如何在SQL中表达此内容的详细信息因您使用的SQL方言而异。我还不清楚在SQL中编写这个是否是个好主意。您可以确定最适合您使用的内容。