【问题标题】:ColdFusion DateDiff - Is there a better way?ColdFusion DateDiff - 有没有更好的方法?
【发布时间】:2015-06-16 20:17:45
【问题描述】:

我只是想结合我团队各个成员的总服务年限。下面的脚本工作正常,但是,每个成员的雇用日期不会从数据库中提取。这意味着我必须对每个雇用的人进行硬编码,然后对他们进行 DateDiff。拥有 28 名成员的团队会引发代码管理的噩梦。

我的主要目标是让代码更简单、更高效,尤其是在管理 28 名团队成员时。如果路径的一部分需要将用户的雇佣数据添加到数据库中;我能做到。我只是看到下面的代码需要重写,我只是不知道最好的方法。

有没有更好的方法?

<cfscript>
  REQUEST.rightnow = Now();
  dateBob = DateDiff("yyyy", "1996 02 01", REQUEST.rightnow);
  dateSam = DateDiff("yyyy", "1996 08 01", REQUEST.rightnow);
  dateJoe = DateDiff("yyyy", "2004 12 01", REQUEST.rightnow);
  dateJohn = DateDiff("yyyy", "2001 01 01", REQUEST.rightnow);
  combinedDate = (dateBob + dateSam + dateJoe + dateJohn);
</cfscript>
<cfoutput>
  #combinedDate# total years<br>
  #dateBob# years<br>
  #dateSam# years<br>
  #dateJoe# years<br>
  #dateJohn# years<br>
</cfoutput>

--- 编辑 ---

根据 Matt 的建议作为数据库查询;像这样?

SELECT hire_date,
        ROUND((DATEDIFF(NOW(),hire_date)) / 365) AS dateDiff
FROM members
WHERE hire_date IS NOT NULL

--- 编辑 2 ---

我刚刚意识到我忘记添加所有“dateDiff”的 SUM()。如果有人使用这个 SQL,你将不得不把它交给 ColdFusion,我想。除非我忽略了在 SQL 中执行此操作的方法?

--- 编辑 3 ---

Per Leigh 的鼓励措施;我找到了更好的方法。 TIMESTAMPDIFF() MySQL 函数添加了一个 unit 变量,可以是日、月、年等。这使我可以删除 / 365 和 ROUND()。这反过来又允许我使用 SUM() 而不会从 MySQL 中得到语法错误。我还将别名从 dateDiff 重命名为 Dif,因为我想避免与 DATEDIFF() 混淆。

见下文。 :D

SELECT hire_date,
        SUM(TIMESTAMPDIFF(YEAR,hire_date,NOW())) AS Dif
FROM members
WHERE hire_date IS NOT NULL

【问题讨论】:

  • 并非如此。我的意思是,您可以将名称作为键加载,将它们的日期作为值加载到结构中,并在结构上循环以使代码更简单。但它基本上会做同样的事情。无论如何,将它放在数据库中基本上可以做到这一点。
  • 如果你把它放到数据库中,这一切都可以通过 SQL 查询来完成
  • 类似这样的东西? 不要滚动你自己的日期逻辑。大多数数据库都有日期函数 - 使用它们 :-) 确切的语法是特定于数据库的,所以请更新问题标签以指示您的 DBMS。
  • (编辑)谢谢。搜索日期逻辑/表达式.. SO上有很多线程。例如,查看this thread 了解计算年份差的逻辑。要查找所有员工的总年数,只需将其包含在 SUM 中。 *RE:这将导致代码管理噩梦。 仅当您没有将数据存储在它所属的数据库中时;-)
  • 我想你必须把它交给 ColdFusion 不,你不需要。数据库也有聚合函数,如SUM 函数。它是一种 SQL 101,因此如果您不熟悉它们,您应该阅读 MySQL docs 和/或查看有关聚合 SQL 函数的教程。

标签: mysql coldfusion datediff simplify


【解决方案1】:

改进为 ColdFusion 发布的代码的解决方案实际上是替换它。通过将每个成员的hire_dates 添加到现有的 MySQL 数据库并编写下面的查询;我不再需要原始帖子中的所有 ColdFusion 代码。

SELECT SUM(TIMESTAMPDIFF(YEAR,hire_date,NOW())) AS Dif
FROM members
WHERE hire_date IS NOT NULL

【讨论】:

  • 如果您只想要一个总体总数,请去​​掉第一个“hire_date”参考。它不是必需的。事实上,上面的语法会在某些数据库中导致语法错误,因为第一列不是聚合函数的一部分。但是,MySQL 对这种事情比较宽容。
  • 更新了!再次感谢你,Leigh!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 2019-01-12
相关资源
最近更新 更多