【问题标题】:Compare dates same column mySQL Laravel比较日期同一列 mySQL Laravel
【发布时间】:2015-11-10 08:57:52
【问题描述】:

我有一个如下所示的“任务”表:

我需要计算每条记录的开始日期偏移量;我需要计算每条记录的开始日期在最小/最低开始日期之后的天数。

我在 Laravel 4 中这样做。表是 mySQL。我真的更喜欢 Laravel 查询,但我也可以包含原始的 mySQL。

我的查询(它也选择了其他一些东西)不起作用

    $tasks = DB::table('tasks')->select(array(DB::raw("TIMESTAMPDIFF(DAY, MIN(start), start) AS offset"), DB::raw("TIMESTAMPDIFF(DAY, start, end) AS length"), 'user_id', 'name', 'desc','start','end','finished'))->where('temp_id', $id)->orderBy('start')->get();

自我比较的“MIN(start)”似乎是问题所在。如何计算每条记录的开始日期在最小开始日期之后的天数?

【问题讨论】:

  • 我在这里可能完全不合时宜,但MIN() 不是在一组记录中找到最小值的聚合函数吗?如果是这样,我认为在单行中的 DATETIME 字段上使用它是没有意义的。
  • 我不能和任何 Laravel 说话,但这是很常见的 @TimLewis。例如,请参阅我写的这个答案here,但使用max 而不是min
  • @Drew Laravel 的查询构建器是基本 SQL 语法的包装器,查看您的答案可以提供一些见解。我会在这里写一个快速的答案。

标签: mysql sql laravel-4


【解决方案1】:

我看到了两种可能的解决方案来解决非聚合结果集上MIN(start) 的错误使用。

选项一:将变量保存为最短日期并在查询中使用:

$min_date = DB::table("tasks")->selectRaw("id, MIN(start) AS min")->groupBy("id")->first();
echo $min_date->min; // 2015-08-15 00:00:00, assuming my syntax was correct.

$tasks = DB::table('tasks')
->select(array(DB::raw("TIMESTAMPDIFF(DAY, ".$min_date->min.", start) AS offset"), DB::raw("TIMESTAMPDIFF(DAY, start, end) AS length"), 'user_id', 'name', 'desc','start','end','finished'))
->where('temp_id', $id)
->orderBy('start')
->get();

选项二:在选择中使用子查询:

$tasks = DB::table('tasks')
->select(array(DB::raw("TIMESTAMPDIFF(DAY, (SELECT MIN(start) FROM tasks), start) AS offset"), DB::raw("TIMESTAMPDIFF(DAY, start, end) AS length"), 'user_id', 'name', 'desc','start','end','finished'))
->where('temp_id', $id)
->orderBy('start')
->get();

MIN() 用法注意事项:它可以在不聚合结果的情况下使用,但只返回单行,除非在子查询中使用。

例子:

SELECT start FROM tasks; /*6 Rows*/
SELECT MIN(start) FROM tasks; /*1 Row*/
SELECT MIN(start), start FROM tasks; /*1 Row*/
SELECT (SELECT (MIN(start) FROM tasks) AS min_start, start FROM tasks; /*6 Rows*/

最后一个示例将返回每一行的结果以及在tasks 中找到的最小值start。希望这有助于解决您的问题。选项 1 或选项 2 应该会有所帮助,但如果您需要其他任何帮助,请留下评论。

【讨论】:

  • 我认为这就是自联接或子查询的用途。我用两个查询做了选项#1,但我确实必须更改 $min_date->low DB::raw("TIMESTAMPDIFF(DAY, '".$low_date->start."' , start) AS offset") 周围的引号,
猜你喜欢
  • 2018-07-18
  • 2017-10-08
  • 2021-07-08
  • 2012-12-20
  • 2013-02-09
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多