sql >> データベース >  >> RDS >> Mysql

SQLでBetweenを使用してAM/PMが機能しない

    日付はDATETIMEとして保存することをお勧めします 。これらの値があるため、データベースフィールドがdateではないことがすでに示されています そのような文字列をdateに挿入するように入力します フィールドはエラーを生成しません。

    これを変更できない場合は、STR_TO_DATEを使用できます。 機能:

    SELECT * 
    FROM `task` 
    WHERE t_status !=3 
    AND   STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p') BETWEEN
            STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p') AND 
            STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p')
    

    しかし、それは本当に劣った解決策です。

    それでも、1行だけを取得するというあなたの期待は奇妙に思えます。確かに、3行目は要件を満たしています。これは、開始日/期日が、時間の部分に関係なく、チェックしている日付の前後であるためです。

    補遺

    コメントでは、別のロジックを適用したいと言っています。私は推測している 日付と時刻のコンポーネントを別々に比較し、両方をbetweenに準拠させたい場合 調子。現在は指定されていないため、これは質問で実際に説明する必要があります。

    その場合は、DATE_FORMATを使用できます 時間部分のみを抽出し、それを使用して条件を繰り返します:

    SELECT *,
           STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p'),
           STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p'),
           STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p')
    FROM `task` 
    WHERE t_status !=3 
    AND   STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p') BETWEEN
            STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p') AND 
            STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p')
    AND   DATE_FORMAT(STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p'), '%h:%i') BETWEEN
            DATE_FORMAT(STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p'), '%h:%i') AND 
            DATE_FORMAT(STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p'), '%h:%i')
    

    このクエリは、結果から3行を除外します。




    1. SQL正確な複数の関係が存在する行のみを選択します

    2. postgresqlのcakephpページ付けカウントクエリを削除または変更するにはどうすればよいですか?

    3. 別のプロジェクトでAppEngineからGCPCloudSQLに接続する

    4. Oracle pl-sqlエスケープ文字('の場合)