我需要计算每条记录的开始日期偏移量;我需要计算每条记录的开始日期是在最小/最低开始日期之后多少天。
我在 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();
self 比较的“MIN(start)”似乎是问题所在。如何计算每条记录的开始日期是最短开始日期之后的多少天?
最佳答案
我看到两种可能的解决方案来解决在非聚合结果集上错误使用 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 应该有所帮助,但请在您需要其他帮助时发表评论。
关于mysql - 比较日期同一列 mySQL Laravel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32055189/