前提・実現したいこと
元々、以下のsql文がありました。
sql
1$sql = "SELECT CAST(work.work_start_time AS DATE), (INTERVAL '24:00:00' - CAST(prev_work.work_end_time AS TIME) + CAST(CAST(work.work_start_time AS TIME) AS INTERVAL)) AS total "; 2$sql .= "FROM obc_work_histories AS work "; 3$sql .= " INNER JOIN obc_work_histories as prev_work on work.mt_employee_id = prev_work.mt_employee_id AND CAST(prev_work.work_end_time AS DATE) = CAST(work.work_start_time AS DATE) - interval '1 day' "; 4$sql .= "WHERE (INTERVAL '24:00:00' - CAST(prev_work.work_end_time AS TIME) + CAST(CAST(work.work_start_time AS TIME) AS INTERVAL)) < INTERVAL '08:00:00' AND work.work_start_time <= ? AND ? <= work.work_end_time ";
このsql文に、「work_start_timeが、00:00:00以上(以外)のもの」という条件を付け足したいです。
発生している問題・エラーメッセージ
2020-02-12 14:20:42 Error: [PDOException] SQLSTATE[22007]: Invalid datetime format: 7 ERROR: "timestamp"型の入力構文が無効です: "00:00:00" LINE 1: ... <= work.work_end_time AND work.work_start_time > '00:00:00' ^ Request URL: /car-maintenance/ObcWorkHistories/search?section=0&employee_number=&fr_date=2019-03-01&to_date=2019-03-31 Stack Trace: #0 C:\xampp\htdocs\car-maintenance\lib\Cake\Model\Datasource\DboSource.php(458): PDOStatement->execute(Array) #1 C:\xampp\htdocs\car-maintenance\lib\Cake\Model\Datasource\DboSource.php(424): DboSource->_execute('SELECT CAST(wor...', Array) #2 C:\xampp\htdocs\car-maintenance\lib\Cake\Model\Datasource\DboSource.php(665): DboSource->execute('SELECT CAST(wor...', Array, Array) #3 C:\xampp\htdocs\car-maintenance\lib\Cake\Model\Datasource\DboSource.php(609): DboSource->fetchAll('SELECT CAST(wor...', Array, Array) #4 [internal function]: DboSource->query('SELECT CAST(wor...', Array, false) #5 C:\xampp\htdocs\car-maintenance\lib\Cake\Model\Model.php(3307): call_user_func_array(Array, Array) #6 C:\xampp\htdocs\car-maintenance\app\Model\AttendanceCheckerCondition\DailyRestTimeChecker.php(31): Model->query('SELECT CAST(wor...', Array, false) #7 C:\xampp\htdocs\car-maintenance\app\Model\AttendanceChecker.php(87): DailyRestTimeChecker->check(137, '2019-03-01', '2019-03-31', true, Array) #8 C:\xampp\htdocs\car-maintenance\app\Controller\ObcWorkHistoriesController.php(135): AttendanceChecker->check(137, '2019-03-01', '2019-03-31', true, true, Array) #9 C:\xampp\htdocs\car-maintenance\app\Controller\ObcWorkHistoriesController.php(39): ObcWorkHistoriesController->searchData() #10 [internal function]: ObcWorkHistoriesController->search() #11 C:\xampp\htdocs\car-maintenance\lib\Cake\Controller\Controller.php(490): ReflectionMethod->invokeArgs(Object(ObcWorkHistoriesController), Array) #12 C:\xampp\htdocs\car-maintenance\lib\Cake\Routing\Dispatcher.php(185): Controller->invokeAction(Object(CakeRequest)) #13 C:\xampp\htdocs\car-maintenance\lib\Cake\Routing\Dispatcher.php(160): Dispatcher->_invoke(Object(ObcWorkHistoriesController), Object(CakeRequest), Object(CakeResponse)) #14 C:\xampp\htdocs\car-maintenance\app\webroot\index.php(108): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse)) #15 {main}
変更後のソースコード(変更した行のみ)
sql
1$sql .= "WHERE (INTERVAL '24:00:00' - CAST(prev_work.work_end_time AS TIME) + CAST(CAST(work.work_start_time AS TIME) AS INTERVAL)) < INTERVAL '08:00:00' AND work.work_start_time <= ? AND ? <= work.work_end_time AND work.work_start_time > '00:00:00' ";
試したこと
ANDをNOTに変えて、条件式もwork.work_start_time = '00:00:00'に変えてみたりしましたが同じくエラーが出ました。
phpとmysqlでprepare処理ですか?
CASTしまくってますがもっと精査すればきれいなSQLになるのでは?
PHPぽいですが、直接DBに対して試すのが先です。
なので、SQL部分だけ取り出してください
精査するとは具体的にどのようなことをするのでしょうか?
元のSQLは別の人が作ったものでして、初心者にはなかなか理解できないものとなっています。
「SQL」部分だけ取り出すというのはどういうことなのでしょうか?
> 精査するとは具体的
具体的なテーブルを提示して、どういうロジックでどういう結果が
ほしいのか例示するところからです
>「SQL」部分だけ取り出すというのはどういうことなのでしょうか?
PHPコードではなく、直にDBに対して実行するSQLのコードという意味です。
提示されたコードはSQLではなくPHPで文字列を変数に詰めているだけです。
>具体的なテーブルを提示して、どういうロジックでどういう結果が
ほしいのか例示するところからです
作り元の人に聞いたところ、精査しなくても大丈夫とのことでした。
>PHPコードではなく、直にDBに対して実行するSQLのコードという意味です。
提示されたコードはSQLではなくPHPで文字列を変数に詰めているだけです。
$result = $wHist->query($sql, [$toDate.' 23:59:59', $frDate.' 00:00:00'], false);
実際に実行している部分は上記だと思うのですが、間違っているでしょうか?
つまり、なんかわからないけど、要望通りSQL文書いてね
でも仕様は教えられないよ・・・ってことですね。
すみません私の力不足でお手伝いできそうもありません
申し訳ありません。
自分が理解できるほど力があれば、仕様を書くことが出来たのですが......
ここまで、テーブルの定義、示されず。
>実際に実行している部分は上記だと思うのですが、間違っているでしょうか?
はい間違っています。
提示されたのはPHPのコードです。
SQL、もとい、DBはPHPからすると外部の仕組みです。
直接DBに対して実行しても想定通りの結果を得られないと当然PHPから実行しても想定の結果は得られません。
ですから、直接DBに対して実行できるSQLを先に作る必要があります。
その区別ができない段階ではPHP触らない方が良いです。余計に混乱しますし問題の切り分けができません。
>ここまで、テーブルの定義、示されず。
テーブルの定義はどのように確認すればいいのでしょうか?
>ですから、直接DBに対して実行できるSQLを先に作る必要があります
言わんとしていることは、わかりました。
まずsql単体で作ってみます。
個人的には、自発的にこのプロジェクトおりたほうがいいと思います。
「なんだか分からないけど動いた」ような状態で組まれたシステムで損害被るのは会社です。
回答3件
あなたの回答
tips
プレビュー