我正在编写一个程序,当他们的订阅即将到期时向用户发送电子邮件,所以我在我的数据库中有一个表,其中日期存储在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();
我得到相同的空输出。我目前卡住了。我读过的所有帖子只使用一个值,所以他们只是声明只返回日期,将其转换为时间戳格式然后进行比较。我有数百个这样的日期,我不能为每个人写一个声明,所以任何帮助解决这个问题将不胜感激。
答案 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)
我创建了一个单独的字段来以人类可读的格式存储日期,因此我不必稍后在我的应用程序中将其转换,然后将相同日期的时间戳格式存储在单独的字段中以处理计算。它更容易使用,阅读并节省了从时间戳转换后来重新转换回时间戳的压力,这是没有意义的。
此处建议更多地利用平台工具。我决定以不同形式使用的数据将以通用格式存储,我将允许平台处理他们想要表示这些数据的方式。