如何将时间戳转为指定字符串格式并在搜索功能中正确使用?
问题原因及解决方法
错误原因
你把PHP的日期处理函数直接写到了Laravel的查询条件里,导致两个问题:
- PHP会先执行
date('D, M dS Y g:i a', strtotime('timestamp')),但strtotime('timestamp')无法解析字符串"timestamp",返回时间戳0,对应日期Thu, Jan 01st 1970 5:30 am - Laravel把这个执行结果当成了数据库的列名,数据库找不到该列,因此抛出
Column not found错误
正确写法
数据库有自己的日期格式化函数,不能用PHP的date/strtotime,要根据数据库类型,用原生SQL的日期处理函数转换格式后再搜索。
情况1:数据库字段是datetime类型(以MySQL为例)
用DATE_FORMAT函数转换格式,结合whereRaw执行原生SQL:
$table->where("main.no", "like", "%{$searchfield}%") ->orWhereRaw("DATE_FORMAT(timestamp, '%a, %b %D %Y %h:%i %p') LIKE ?", ["%{$searchfield}%"]);
格式符对应关系:
%a→ PHP的D(星期缩写,如Thu)%b→ PHP的M(月份缩写,如Mar)%D→ PHP的S(带后缀的日期,如01st)%Y→ PHP的Y(4位年份)%h→ PHP的g(12小时制小时)%i→ PHP的i(分钟)%p→ PHP的a(AM/PM,MySQL返回大写,搜索时不区分大小写不影响)
情况2:数据库字段是int类型的时间戳(以MySQL为例)
先通过FROM_UNIXTIME把时间戳转成datetime,再格式化:
$table->where("main.no", "like", "%{$searchfield}%") ->orWhereRaw("DATE_FORMAT(FROM_UNIXTIME(timestamp), '%a, %b %D %Y %h:%i %p') LIKE ?", ["%{$searchfield}%"]);
注意事项
- 用
?占位符是为了避免SQL注入,不要直接把$searchfield拼进SQL字符串 - 如果使用非MySQL数据库,需替换为对应数据库的日期格式化函数(比如PostgreSQL用
TO_CHAR)
内容的提问来源于stack exchange,提问作者vaishnavi
相关产品推荐
相关产品推荐

