从 Mysql 数据库 Timestamp Laravel 中仅选择本周记录。

4

我希望能够在本周内仅获取周一到周五的记录,但是针对如何实现此功能我很难思考和研究,我在互联网上找到了一些方法,但对于像我这样的新手来说理解起来很困难,以下是我的代码:

         $myquery=DB::table('attendances')
        ->leftJoin('employees', 'attendances.user_id', '=', 'employees.id')
        ->where('user_id', '=', $employee->id)

        //I want to do something like this one
         ->WHERE WEEK(`date`) = WEEK(NOW()  

        ->orderBy('attendances.date','asc')->get();

我实现了一些类似于这样的答案

         $myquery=DB::table('attendances')
        ->leftJoin('employees', 'attendances.user_id', '=', 'employees.id')
        ->where("WEEKOFYEAR(`date`)", "=", "WEEKOFYEAR(NOW())")
        ->where('user_id', '=', $employee->id)
        ->orderBy('attendances.logon','asc')->get();
5个回答

7
您可以使用两个Carbon日期实例的whereBetween
->whereBetween('date', [
    Carbon\Carbon::parse('last monday')->startOfDay(),
    Carbon\Carbon::parse('next friday')->endOfDay(),
])

如果您想查找当前月份的所有记录,请使用以下方法:
->whereBetween('date', [
    Carbon\Carbon::now()->startOfMonth(),
    Carbon\Carbon::now()->endOfMonth(),
])

本月所有记录怎么样? - John Evans Solachuk
1
@Mark - 已添加到我的答案中。 - Joseph Silber
1
如果今天是星期一,则返回上周的星期一,这是不好的。更好的方法是使用 Carbon::now()->startOfWeek() 和 Carbon::now()->endOfWeek()。 - MaTTo

2

您需要使用WEEKOFYEAR()而不是只使用WEEK,后者只会得到一年中当前周的索引。因此,在同一周内的两个日期将返回相同的WEEKOFYEAR。在普通的SQL中,它看起来像:

... WHERE WEEKOFYEAR(`date`) = WEEKOFYEAR(NOW())

在Laravel中:
->where("WEEKOFYEAR(`date`)", "=", "WEEKOFYEAR(NOW())")

谢谢您的回复,先生。但是在Laravel代码中,我遇到了错误50。 - user3177305
你是怎样集成这个答案的? - Spencer Wieczorek
在代码中, date 是什么?它是否有定义?尝试添加一个字符串,比如 '2014-01-01',这是否仍会导致500错误? - Spencer Wieczorek
先生,我仍然遇到错误,如果我使用WhereOr,则没有错误,但输出是错误的。 - user3177305
日期是 MySQL 数据库中的一列,它是一个时间戳。 - user3177305
2
如果它是一个时间戳,则将其转换为日期。Laravel 可能会将第一个属性视为需要成为一列。不妨尝试使用原始 SQL:->whereRaw('WEEKOFYEAR(DATE(\date`)) = WEEKOFYEAR(NOW())');` - Spencer Wieczorek

0

这个怎么样?(Eloquent / Laravel 5.6)

Model::whereMonth('created_at', '=', date('Y'));

它有很好的文档记录并且运行良好:查询


这对于月份范围很有用,但并没有解决问题。 - Tomáš Staník

0
我会尝试这样做: ->where('WEEK(FROM_UNIXTIME(`date`))', '=', 'WEEK(NOW())') ->where('DAYOFWEEK(FROM_UNIXTIME(`date`))', '>=', 2) ->where('DAYOFWEEK(FROM_UNIXTIME(`date`))', '<=', 6)

考虑将查询语句放在try/catch块中,以便更明显地显示错误。此外,我已更新查询语句以考虑您在另一条评论中提到的使用Unix时间戳作为列的事实。 - Wing Lian

0
获取本周数据,不包括周六和周日:
$query->where(DB::Raw('week(date)'), '=', Carbon::now()->weekOfYear)
      ->where(function($query){
             return $query->where(DB::Raw('day(date)'),'<>',Carbon::SUNDAY)
                          ->orWhere(DB::Raw('day(date)'), '<>',Carbon::SATURDAY); });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接