在数据库中以不同格式存储日期时,使用Eloquent直接比较日期

时间:2018-04-12 19:03:07

标签: php laravel laravel-5.4 laravel-eloquent

我正在编写一个程序,当他们的订阅即将到期时向用户发送电子邮件,所以我在我的数据库中有一个表,其中日期存储在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();

我得到相同的空输出。我目前卡住了。我读过的所有帖子只使用一个值,所以他们只是声明只返回日期,将其转换为时间戳格式然后进行比较。我有数百个这样的日期,我不能为每个人写一个声明,所以任何帮助解决这个问题将不胜感激。

3 个答案:

答案 0 :(得分:1)

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而不是反过来使用它。

答案 1 :(得分:0)

帮助自己并将日期存储为YYYY-MM-DD(在date列中),这将使您的生活更轻松。它也很容易阅读,并且已成为年龄的标准格式(有充分的理由)。

您为前端选择的格式是另一回事。您可以使用accessor

答案 2 :(得分:0)

我创建了一个单独的字段来以人类可读的格式存储日期,因此我不必稍后在我的应用程序中将其转换,然后将相同日期的时间戳格式存储在单独的字段中以处理计算。它更容易使用,阅读并节省了从时间戳转换后来重新转换回时间戳的压力,这是没有意义的。

此处建议更多地利用平台工具。我决定以不同形式使用的数据将以通用格式存储,我将允许平台处理他们想要表示这些数据的方式。