1. 程式人生 > >數據庫查詢時日期的轉換

數據庫查詢時日期的轉換

lan select laravel框架 format格式化 mysql查詢 lar 再次 報錯 orm

  首先簡單說明一下,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等於的是一個字符串,發現了原因,到查詢為空的語句中加上了引號,終於解決了問題。

數據庫查詢時日期的轉換