【发布时间】: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