簡體   English   中英

Laravel Eloquent 比較日期時間字段中的日期

[英]Laravel Eloquent compare date from datetime field

我想通過表達式從表中獲取所有行:

table.date <= 2014-07-10

但是,如果該列包含日期時間,讓我們說:

2014-07-10 12:00:00

但如果我這樣做:

where('date', '<=', $date)

它不會得到行。

我猜這是因為 $date = 2014-07-10 這讓 MySQL 假設它是 2014-07-10 00:00:00。

在常規 MySQL 中,我會做

where DATE(date) <= $date

使用 Laravel 的 Eloquent 等效於什么?

Laravel 4+ 為您提供了這些方法: whereDay()whereMonth()whereYear() ( #3946 ) 和whereDate() ( #6879 )。

他們為您執行 SQL DATE()工作,並管理 SQLite 的差異。

你的結果可以這樣實現:

->whereDate('date', '<=', '2014-07-10')

有關更多示例,請參閱#3946 的第一條消息和這篇Laravel Daily 文章


更新:雖然上述方法很方便,但正如 Arth 指出的那樣,它在大型數據集上效率低下,因為必須在每條記錄上應用DATE() SQL 函數,從而丟棄可能的索引。

以下是進行比較的一些方法(但請閱讀下面的注釋):

->where('date', '<=', '2014-07-10 23:59:59')

->where('date', '<', '2014-07-11')

// '2014-07-11'
$dayAfter = (new DateTime('2014-07-10'))->modify('+1 day')->format('Y-m-d');

->where('date', '<', $dayAfter)

筆記:

  • 23:59:59 可以(暫時)因為 1 秒的精度,但是看看這篇文章:23: 59 : 59 不是一天的結束。 不完全是!
  • 請記住“零日期”情況(“0000-00-00 00:00:00”)。 雖然應該避免這些“零日期”,但它們是許多問題的根源。 如果需要,最好使該字段可以為空。

您是否考慮過使用:

where('date', '<', '2014-08-11')

您應該避免在 MySQL 中的索引列上使用DATE()函數,因為這會阻止引擎使用索引。

更新

由於似乎對DATE()和索引的重要性存在一些分歧,我創建了一個演示差異的小提琴,請參閱POSSIBLE KEYS

您可以使用它獲取日期“2016-07-14”的所有記錄

 whereDate('date','=','2016-07-14')

或者使用另一個代碼作為動態日期

whereDate('date',$date)

你可以用這個

whereDate('date', '=', $date)

如果您提供 whereDate,則僅比較日期時間字段中的日期。

如果您仍然想知道如何解決它。

我用

$protected $dates = ['created_at','updated_at','aired'];

在我的模型和我做的地方

where('aired','>=',time())

所以只需使用unix來比較在哪里。

另一方面,在視圖中,您必須使用日期對象。

希望它可以幫助某人!

這是我的邏輯:如果您正在比較日期,那么您的方法應該是 whereDate,如果您比較完整的日期時間,那么您的方法將只在:

$calendar_alert = DB::table('calendar_alerts')->whereDate('when', '=', now()->format('Ym-d'))->where('when', '>', now()->format('H:i:s'))->get();

use Carbon\Carbon;

public function scopePublished($query)
{
  $now = Carbon::now();
  $date = Carbon::parse($now)->toDateString();
  $time = Carbon::parse($now)->toTimeString();
  return $query->whereDate('published_at', '<', $date)
  ->orWhere(function($query) use ($date, $time) {
    $query->whereDate('published_at', '=', $date)
    ->whereTime('published_at', '<=', $time);
  });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM