Confluence 에 심각한 보안 취약점이 발견되었으니 사용자분들은 업그레이드 하세요.!
 
1
0
-1

우선 시간은 제가 Carbon으로 가져오고

→year; →month;, →hour.... 로 년월일시분초 를 가져옵니다 

그것을 이용하여 데이터베이스의 2019-08-15 14:00:00 형식의 time 컬럼과 비교하여 원하는 시간대의 값을 가져오는데요

오늘 day보다 뒷날의 값을 가져오는것은 whereDay('time', '>=', $day) 와같은 형식으로 가져오는것에 성공하였습니다.

하지만 여기서 두 가지 문제가 발생합니다

첫 번째로는 시간을 비교할 땐 whereTime으로 비교하던데 $hour 같이 단순 시간으로만 비교하면 안먹히는거 같더군요

이 문제는 가져온 시간을 가공하거나 가져올 때 시분초를 함께 가져온다던지 방법은 떠오릅니다, 찾아본다면 제가 해결할 수 있을 거 같더군요.

하지만 두 번째 문제는.. 과거의 정보 즉... 저번달이라면 day에 신경을 안써도 되지만 이번달이라면 day에 신경을 써야하는 경우에.. 어떻게 해야할지 감이오지 않습니다..whereColumn이라는 것이 있어서 써봤지만

whereMonth같은 경우 제가 잘못한지몰라도 안먹히더라구요 

도움을 주신다면 정말 감사하겠습니다 긴글 읽어주셔서 감사합니다..

두 가지 모두 알려주시면 감사하겠습니다. 안되신다면 두 번째 문제만이라도 도움을 요청드리겠습니다.

    CommentAdd your comment...

    1 answer

    1.  
      2
      1
      0

      MySQL 공식 문서 참고바랍니다. https://dev.mysql.com/doc/refman/5.7/en/DATE-AND-TIME-functions.html

      SELECT now(), YEAR(now()), QUARTER(now()), MONTH(now()), DAY(now()), HOUR(now()), MINUTE(now()), SECOND(now());
      /*
      {
      	"data":
      	[
      		{
      			"now()": "2019-08-15 23:02:37",
      			"YEAR(now())": 2019,
      			"QUARTER(now())": 3,
      			"MONTH(now())": 8,
      			"DAY(now())": 15,
      			"HOUR(now())": 23,
      			"MINUTE(now())": 2,
      			"SECOND(now())": 37
      		}
      	]
      }
      */


      쿼리빌더로 시간을 비교한다고 가정하면 이렇게 할 수 있습니다.

      >>> factory(App\User::class)->create(['birthday' => '2019-01-01']);
      => App\User {#3002
           name: "Mr. Jaren Stiedemann MD",
           email: "econroy@example.net",
           email_verified_at: "2019-08-15 14:00:20",
           birthday: "2019-01-01 00:00:00",
           updated_at: "2019-08-15 14:00:20",
           created_at: "2019-08-15 14:00:20",
           id: 1,
         }
      
      
      >>> App\User::query()->whereRaw("HOUR(created_at) > ?", 15)->get();
      => Illuminate\Database\Eloquent\Collection {#2992
           all: [],
         }
      
      >>> App\User::query()->whereRaw("HOUR(created_at) > ?", 13)->get();
      => Illuminate\Database\Eloquent\Collection {#3010
           all: [
             App\User {#2989
               id: 1,
               name: "Mr. Jaren Stiedemann MD",
               email: "econroy@example.net",
               email_verified_at: "2019-08-15 14:00:20",
               created_at: "2019-08-15 14:00:20",
               updated_at: "2019-08-15 14:00:20",
               birthday: "2019-01-01",
             },
           ],
         }
      1. 이무진

        whereRaw 를 사용하면 되겠네요 한 번 테스트 해봐야겠습니다 감사합니다!!

      2. Sangseng

        그리고 where 절에 펑션을 쓰게 되면, 성능 저하가 있다는 점을 염두에 두고 사용하시는게 좋습니다. 

      3. 이무진

        앗 너무 늦게봤네요 죄송합니다.

        펑션이 성능 저하를 주는군요.. 혹시 더 좋은 방법이 있나요?.. 성능 저하가 있더라도 필요한 조건이라 흑 ㅜㅜ 

        우선 where (function 쓰고있습니다

      4. Sangseng

        음... 꼭 펑션을 써야할 상황이 아니라면 between 으로 데이터를 가져온 후에, collection 으로 집계하는 것이 낫다고 생각합니다. 만약 년,월별 집계가 꼭 필요한 테이블이라면, 해당 컬럼을 추가해서 인덱싱 추가해주고, 해당 컬럼으로 처리하면 될 것 같고요. 만약 레코드가 넘쳐난다면, 파티셔닝도 고려하는 건 어떨지 싶습니다.

      CommentAdd your comment...