Laravel 在 where 子句中更改日期格式以匹配 Carbon::now()

Posted

技术标签:

【中文标题】Laravel 在 where 子句中更改日期格式以匹配 Carbon::now()【英文标题】:Laravel change date format in where clause to match Carbon::now() 【发布时间】:2018-06-10 02:33:58 【问题描述】:

我需要根据未来发生的日期和 条目包含日期格式:

12/30/17

我正在尝试格式化日期并与 Carbon::now() 时间戳进行比较,但没有运气。

$now = \Carbon\Carbon::now();

$bookings = DB::table('booking')
    ->select('booking.*')
    ->where('booking.uid', '=', Auth::id())
    ->where(DB::raw("(DATE_FORMAT(booking.date,'%Y-%m-%d 00:00:00'))"), ">=", $now)
    ->get();

【问题讨论】:

为什么你的日期不是以标准格式出现在你的表格中? 我希望是这样。目前我无法控制。 @Klav 你是什么意思你无法控制?您可以编写一个简单的查询来将所有日期行更改为单一格式。 @AlexeyMezenin 因为更改表格中的日期格式并不是唯一需要更新的事情。 @Klav 好吧,这是在这种情况下唯一正确的方法。以不同的格式保持行是无稽之谈。我怀疑做相关修复太难了(移除重新发明的***并改用 Carbon)。 【参考方案1】:

您需要使用STR_TO_DATE 来转换字符串。

$bookings = DB::table('booking')
    ->select('booking.*')
    ->where('booking.uid', '=', Auth::id())
    ->where(DB::raw("(STR_TO_DATE(booking.date,'%m/%d/%y'))"), ">=", $now)
    ->get();

STR_TO_DATE 会将12/30/17 转换为2017-12-30

【讨论】:

现在好了,我有改变方法并且工作正常@aynber【参考方案2】:

我认为您确实不需要检查日期格式。此外,您的查询中有一些多余的东西。只需这样做:

Booking::where('uid', auth()->id())->where('date', '>=', now())->get();

如果同一列中某些行的日期格式确实不同,您确实需要解决这个问题,而不是为此做一些肮脏的修复。

【讨论】:

我最初尝试过,但它不能正确地提取日期。 >= 什么都不拉, 【参考方案3】:
$bookings = DB::table('booking')
    ->select('booking.*')
    ->where('booking.uid', '=', Auth::id())
    ->where(DB::raw("(DATE_FORMAT(booking.date,'%Y-%m-%d'))"), ">=", $now)
    ->get();

【讨论】:

以上是关于Laravel 在 where 子句中更改日期格式以匹配 Carbon::now()的主要内容,如果未能解决你的问题,请参考以下文章

SQL在where子句中转换日期格式

ASP - 从 MS Access DB 获取记录时遇到日期格式(在 WHERE 子句中)

SAS:在where子句中将日期时间转换为日期

where 子句中的日期时间

在 where 子句中将字符串更改为日期时间格式以进行比较

如何在 WHERE 子句中使用混合文本和日期字段?