數據庫查詢時日期的轉換
首先簡單說明一下,laravel框架中查詢並打印sql語句的辦法,不管任何時候由於sql語句報錯時,都可以先打印一下,分析一下是什麽原因造成的錯誤
①引入laravel框架DB類 use Illuminate\Support\Facades\DB; ②開啟框架日誌記錄 DB::connection()->enableQueryLog(); ③條件,即要查詢的sql語句 User::all(); ④輸出打印所有的日誌(sql) dd(DB::getQueryLog());
回歸正題:這裏遇到的問題是查詢語句中的時間戳的轉換(laravel查詢構建器);
初試:時間分組的顯示,這裏使用的原生查詢方法(DB:raw()),先使用from_unixtime( ),時間戳轉換為日期格式,然後使用格式化函數,將日期改為需要顯示的日期並進行分組.
$summary = Article::query()->select(DB::raw("DATE_FORMAT(from_unixtime(art_time),‘%Y-%m‘) as time")) ->groupBy(‘art_time‘) ->orderBy(‘art_time‘,‘desc‘) ->get();
接下來需要將同一日期下的文章填到上面得到的日期下
foreach ($summary as $v) { $childart = DB::select("select DATE_FORMAT(from_unixtime(art_time),‘%Y‘) as sumtime,art_id,art_title from blog_article where sumtime =".$v->time);
$v->childart = $childart; }
這裏開始報錯:
這個錯誤很簡單,查詢where條件不能取前面別名,數據庫沒有這個字段自然會報錯,然後修改了語句
foreach ($summary as $v) { $childart = DB::select("select DATE_FORMAT(from_unixtime(art_time),‘%Y‘) as sumtime,art_id,art_title from blog_article where date_format(from_unixtime(art_time),‘%Y-%m‘)= ".$v->time); print_r(DB::getQueryLog()); dd($childart); $v->childart = $childart; }
再次查詢,發現為空,於是打印了sql語句如下:
沒有報錯,查詢為空,可以想到是由於where條件不匹配的原因導致的,然後發現date_format格式化後應該為一個字符串,這裏顯示的數字,自然不會查詢出來。於是修改sql語句
foreach ($summary as $v) { $childart = DB::select("select DATE_FORMAT(from_unixtime(art_time),‘%Y‘) as sumtime,art_id,art_title from blog_article where date_format(from_unixtime(art_time),‘%Y-%m‘) = ‘".$v->time."‘"); dd($childart); $v->childart = $childart; }
到此,此問題解決。
後續:在自己看完打印出來的sql語句後,覺得根本沒有問題,多次修改sql語句後仍無查到信息,由於對mysql查詢的不了解以及之前不怎麽使用date_format(),認為where條件不能這樣寫(where date_format(from_unixtime(art_time),‘%Y-%m‘) = .$v->time),即where條件中對字段進行修飾,於是想存的時間戳太過麻煩,便直接到數據庫增加一個字段用來存放時間日期格式,更新這個字段內容的時候使用了之前講的通過表格sublime操作mysql的簡便方法。做了20條語句:
到sql編輯器中運行sql語句,運行成功。看了看這條語句,又想了想之前的那條,覺得即使在where條件中加date_format應該也是可以的。
再次嘗試:直接在sql編輯器中嘗試了以下兩條語句,運行,成功了
update blog_article set summary =date_format(from_unixtime(art_time),‘%Y-%m‘) where art_id =8;
select * from blog_article where date_format(from_unixtime(art_time),‘%Y-%m‘) = ‘2018-08‘;
突然發現這裏的date_format等於的是一個字符串,發現了原因,到查詢為空的語句中加上了引號,終於解決了問題。
數據庫查詢時日期的轉換