我有专栏" exp_date"对于字符串类型,列的格式为d.m.Y. 我希望在两个日期之间获得记录。
我正在尝试使用此代码:
$start = '10.09.2016';
$end = '20.10.2018';
$company->records()->whereBetween('exp_date', [$start, $end])->get();
答案 0 :(得分:2)
只需使用扩展本机PHP DateTime类的carbon package。
示例1:数据库列类型设置为date
或dateTime
$ start =' 10.09.2016&#39 ;;
$ end =' 20.10.2018';
$start = Carbon::createFromFormat('d-m-Y', $start)->toDateTimeString();
$end = Carbon::createFromFormat('d-m-Y', $end)->toDateTimeString();
然后创建查询
$company = Records::where(function($q){
$q->where('exp_date', '<=',$start );
$q->where('exp_date', '>', $end);
});
$company->get();
示例2:数据库列类型设置为varchar
在这里,您首先必须通过迁移来隐藏现有的表格列。
在修改列之前,请务必将doctrine/dbal
依赖项添加到composer.json
文件中。
php artisan make:migration update_exp_to_records_table --table=records
编辑迁移文件,添加以下与您的表名相关的文件
Schema::table('records', function ($table) {
$table->string('expire')->date()->change();
});
仅运行此特定迁移 然后在控制器函数中使用上面的示例1.
答案 1 :(得分:0)
使用原始查询,您应该使用以下内容:
SELECT * FROM table_name
WHERE UNIX_TIMESTAMP(col_name) > UNIX_TIMESTAMP(:start)
AND UNIX_TIMESTAMP(col_name) < UNIX_TIMESTAMP(:end)
您不必在UNIX_TIMESTAMP()
中使用$start
,而在PHP中使用$end
只需strtotime()
。
注意:如果MySQL没有在unix时间戳中输入你的字符串,可能需要使用函数CAST()
。