当日期以不同格式存储在数据库中时,使用 Eloquent 直接比较日期
comparing date drectly using Eloquent when date is stored in a different format in a database
我正在编写一个程序,当用户的订阅即将到期时,它会向用户发送电子邮件,所以我的数据库中有一个 table,日期存储在 varchar 中,作为 12th April 2018
我正在使用它格式,因为它很容易阅读,所以我以后不必再转换它。但是当我写
$currentdate= Carbon::now()->toDateTimeString();
$threeDaystoExpire =Carbon::now()->addDays(130)->toDateTimeString();
return $expiredPacks = DB::table('subscriptions')
->whereDate('expires_on','>',$currentdate)
->whereDate('expires_on','<=',$threeDaystoExpire)
->get();
我得到一个空白 return
输出,但是当我将 expires_on
更改为 created_at
格式如下 2018-04-12 12:41:36
我得到正确的输出。我尝试更改 $currentdate
和 $threeDaystoExpire
的格式以匹配我的数据库中的数据,正如我阅读的先前线程所建议的那样再次尝试
$currentdate= Date('dS F Y', strtotime(Carbon::now()->toDateTimeString()));
$threeDaystoExpire =Date('dS F Y', strtotime(Carbon::now()->addDays(130)->toDateTimeString()));
return $expiredPacks = DB::table('subscriptions')
->whereDate('expires_on','>',$currentdate)
->whereDate('expires_on','<=',$threeDaystoExpire)
->get();
我得到了同样的空输出。我目前卡住了。我读过的所有帖子都只使用一个值,所以他们只对 return 声明日期,将其转换为时间戳格式,然后进行比较。我有数百个这样的日期,我不能为每个日期写一个声明,所以任何解决这个问题的帮助将不胜感激。
toDateTimeString()
方法将 Carbon DateTime 对象转换为特定格式,例如 1975-12-25 14:15:16
,这与您的 varchar 字段不匹配。
尝试使用 Carbon API 将 Now 转换为您需要的格式...
$currentdate = Carbon::now()->format('dS F Y');
$threeDaystoExpire = Carbon::now()->addDays(130)->format('dS F Y');
我还要指出,比较将首先查看日期,然后是月份的字符串值,然后是数字年份。这会给你非常奇怪的结果。我可能会在您的 varchar 字段的输出上推荐 strtotime
并使用它来代替其他方式。
帮自己一个忙,将日期存储为 YYYY-MM-DD
(在 date
列中),这会让您的生活更轻松。它也很容易阅读并且一直是标准格式(有充分的理由)。
您为前端选择的格式是另一回事。您也许可以为此使用 accessor。
我制作了一个单独的字段以人类可读的格式存储日期,这样我以后就不必在我的应用程序中转换它,然后将相同日期的时间戳格式存储在一个单独的字段中以处理计算.它更易于使用、阅读,并让我省去从时间戳转换然后再转换回时间戳的压力,这没有意义。
按照此处的建议,更多地利用平台工具。我决定将以不同形式使用的数据以通用格式存储,我将允许平台处理他们希望如何表示这些数据。
我正在编写一个程序,当用户的订阅即将到期时,它会向用户发送电子邮件,所以我的数据库中有一个 table,日期存储在 varchar 中,作为 12th April 2018
我正在使用它格式,因为它很容易阅读,所以我以后不必再转换它。但是当我写
$currentdate= Carbon::now()->toDateTimeString();
$threeDaystoExpire =Carbon::now()->addDays(130)->toDateTimeString();
return $expiredPacks = DB::table('subscriptions')
->whereDate('expires_on','>',$currentdate)
->whereDate('expires_on','<=',$threeDaystoExpire)
->get();
我得到一个空白 return
输出,但是当我将 expires_on
更改为 created_at
格式如下 2018-04-12 12:41:36
我得到正确的输出。我尝试更改 $currentdate
和 $threeDaystoExpire
的格式以匹配我的数据库中的数据,正如我阅读的先前线程所建议的那样再次尝试
$currentdate= Date('dS F Y', strtotime(Carbon::now()->toDateTimeString()));
$threeDaystoExpire =Date('dS F Y', strtotime(Carbon::now()->addDays(130)->toDateTimeString()));
return $expiredPacks = DB::table('subscriptions')
->whereDate('expires_on','>',$currentdate)
->whereDate('expires_on','<=',$threeDaystoExpire)
->get();
我得到了同样的空输出。我目前卡住了。我读过的所有帖子都只使用一个值,所以他们只对 return 声明日期,将其转换为时间戳格式,然后进行比较。我有数百个这样的日期,我不能为每个日期写一个声明,所以任何解决这个问题的帮助将不胜感激。
toDateTimeString()
方法将 Carbon DateTime 对象转换为特定格式,例如 1975-12-25 14:15:16
,这与您的 varchar 字段不匹配。
尝试使用 Carbon API 将 Now 转换为您需要的格式...
$currentdate = Carbon::now()->format('dS F Y');
$threeDaystoExpire = Carbon::now()->addDays(130)->format('dS F Y');
我还要指出,比较将首先查看日期,然后是月份的字符串值,然后是数字年份。这会给你非常奇怪的结果。我可能会在您的 varchar 字段的输出上推荐 strtotime
并使用它来代替其他方式。
帮自己一个忙,将日期存储为 YYYY-MM-DD
(在 date
列中),这会让您的生活更轻松。它也很容易阅读并且一直是标准格式(有充分的理由)。
您为前端选择的格式是另一回事。您也许可以为此使用 accessor。
我制作了一个单独的字段以人类可读的格式存储日期,这样我以后就不必在我的应用程序中转换它,然后将相同日期的时间戳格式存储在一个单独的字段中以处理计算.它更易于使用、阅读,并让我省去从时间戳转换然后再转换回时间戳的压力,这没有意义。
按照此处的建议,更多地利用平台工具。我决定将以不同形式使用的数据以通用格式存储,我将允许平台处理他们希望如何表示这些数据。