jjzjj

mysql - 根据加入日期计算员工的下一个 3 周年纪念日

coder 2023-10-24 原文

我有一个员工 mysql 数据库表,其中包含员工姓名和开始日期。我希望能够从今天开始计算每位员工即将到来的 3 周年纪念日。 (例如,乔丹的下一个即将到来的周年纪念日是 2019 年 8 月 25 日,李的周年纪念日是 2017 年 9 月 22 日,迈克的周年纪念日是 2018 年 10 月 26 日)

id    name       startDate        
---------------------------
0     Jordan     08/25/2010          
1     Lee        09/22/2014          
2     Mike       10/26/2015        

低效的蛮力解决方案是生成从开始日期到当前日期的所有周年纪念日期加上今天日期之后的一个日期,然后选择它。

但是必须有一个更高效的 SQL 查询来根据今天的日期为每个员工显示下一个即将到来的周年纪念日。必须以某种方式使用 DATEDIFF。

最佳答案

已编辑

SELECT
  *
  ,CASE
    WHEN CURDATE() <= startDate THEN startDate + INTERVAL 3 year
    WHEN MOD((YEAR(CURDATE()) - YEAR(startDate)),3) = 0
      AND (CURDATE() - INTERVAL YEAR(CURDATE()) year) 
          <= (startDate - INTERVAL YEAR(startDate) year) 
      THEN startDate + INTERVAL (YEAR(CURDATE()) - YEAR(startDate)) year
    ELSE startDate + INTERVAL (year(CURDATE()) - YEAR(startDate) + 3 - MOD(YEAR(CURDATE()) - YEAR(startDate),3)) year
  END   as "Next3YrAniversary"
FROM
  TableName

SQL Fiddle 向您展示它如何处理测试用例: http://www.sqlfiddle.com/#!9/cf276a/1

反正思路是这样的:

  • startDate is Today or in future if so just add 3 years
  • Remainder of (Yesrs Diff / 3) = 0 and if current month/day is <= month/day of startDate如果今年是周年纪念日并且还没有发生,那么add number of years between current date and startDate to startDate .如果它是2016,那么说它的方式略有不同。周年纪念日在2016它将查看今年是否已举行周年纪念日。
  • 否则添加到开始日期:Number of years between Start Date & Now + 3 years - Remainder of (Years between Now and startDate / 3)

关于 YEAR() 的注释对比year .你可以写 year()YEAR()我倾向于将我的特定函数等大写,但是 year() 函数只得到 INT日期的年份。所以YEAR(CURDATE())表示获取当前日期的年份,例如2016 , YEAR(startDate)获取 startDate 的年份例如2013 . MOD()给你除法的余数所以 2 / 3 remainder 1

2016 - 2013 gives you 3 so remainder of 3/3 is 0

不是函数的小写年份 [没有括号] 定义了一个 INTERVAL 类型,您可以使用日、年、月等。

date INTERVAL + 1 year = add 1 year to date

另一个例子是

startDate INTERVAL + NumOfYearsDiff year = add NumOfYearsDiff to startDate

在情况 2 中,比较我所做的是使两个日期本质上都是 YEAR 0001通过从日期中减去年份整数,然后比较哪个日期会告诉我今年晚些时候的日期,以了解周年纪念日是否已经过去或今年仍将到来。 TIMESTAMPDIFF在一定程度上自动为您执行此操作,但如果您使用,则周年纪念日将是下一个,例如2019如果是今天 2016 .所以如果你想像今天一样展示它,你仍然需要检查我所做的相同条件,这意味着没有真正的理由使用 TIMESTAMPDIFF .

这是我的方法、Spencer 的和 Gordon 的并排比较的 sqlfiddle http://www.sqlfiddle.com/#!9/cf276a/3

显示内容:

  • 如果周年纪念日是今天,Gordon's & Spencer 的方法会将下一个周年纪念日显示为今天 + 3 年。哪些是需要的,哪些是不需要的?
  • Gordon 对 future 日期的回答将显示开始日期而不是开始日期 + 3 年

关于mysql - 根据加入日期计算员工的下一个 3 周年纪念日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39521375/

有关mysql - 根据加入日期计算员工的下一个 3 周年纪念日的更多相关文章

  1. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  4. ruby - 如何离开加入Arel? - 2

    Arel3.0.2提供了两个类来指定连接类型:Arel::Nodes::InnerJoin和Arel::Nodes::OuterJoin并使用InnerJoin默认。foo=Arel::Table.new('foo')bar=Arel::Table.new('bar')foo.join(bar,Arel::Nodes::InnerJoin)#innerfoo.join(bar,Arel::Nodes::OuterJoin)#outerfoo.join(bar,???)#left如果要生成左连接,如何连接两个表? 最佳答案 你可以使用

  5. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  6. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  7. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  8. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  9. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  10. ruby - 检查日期是否在过去 7 天内 - 2

    我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/

随机推荐