67776

[code]

    -- 会社テーブル
    CREATE TABLE `companys` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(30) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
    
    INSERT INTO `companys` (`id`, `name`) VALUES
    (1, '会社A'),
    (2, '会社B');
    
    -- ユーザーテーブル
    CREATE TABLE `users` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(30) NOT NULL,
      `created` datetime NOT NULL,
      `company_id` int(11) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
    
    INSERT INTO `users` (`id`, `name`, `created`, `company_id`) VALUES
    (1, 'タロウ',  '2020-06-01 00:00:00',  1),
    (2, 'ジロウ',  '2020-06-02 00:00:00',  2),
    (3, 'サブロウ', '2020-06-03 00:00:00',  1);
    
    -- VIEWテーブル
    CREATE VIEW `users_view` AS select `u`.`id` AS `id`,`u`.`name` AS `name`,`u`.`created` AS `created`,`c`.`name` AS `company_name` from (`users` `u` join `companys` `c` on(`u`.`company_id` = `c`.`id`)) order by `u`.`created` desc;
    
[/code]

上記で作成したVIEWテーブルに対して、下記SQLでレコードが取得できません。

[code]

    SELECT * FROM `users_view` WHERE `created` >= '2020-06-02 00:00:00';
    
[/code]

ただし、VIEWテーブルのORDER BYを下記の通り、DATE_FORMAT関数で指定するとレコードが取得できるようになります。

[code]

    select `u`.`id` AS `id`,`u`.`name` AS `name`,`u`.`created` AS `created`,`c`.`name` AS `company_name` from (`users` `u` join `companys` `c` on(`u`.`company_id` = `c`.`id`)) order by date_format(`u`.`created`,'%Y-%m-%d %H:%i:%s') desc;
    
[/code]

これはなぜでしょうか。

* * *

追記

mysql --version

mysql Ver 15.1 Distrib 10.4.12-MariaDB, for debian-linux-gnu (x86_64) using
readline 5.2

ORDERBYを指定しない場合は、DATETIMEの比較でレコードが取得できます。


CC BY-SA 4.0
2020-06-18T00:32:10.060
67771
2020-06-21T20:25:12.050
2020-06-18T07:39:59.027
22665
40711
question
sql mariadb
ORDER BYにDATETIMEを設定しているVIEWテーブルに対してDATETIMEのWHEREが効かなくなる


~~DBの日付のデフォルト形式がXXXX-XX-XX XX:XX:XXではないからです。~~  
~~日付は下記のどちらかにするのが定番です。~~  
~~・使用する際に常に形式を指定する~~  
~~・そもそもyyyymmddhhmmssのような文字列で保存し、文字列比較でできるようにしておく~~

6/21追記  
上記回答は誤りだったため、訂正します。すいません。  
mariadbのリファレンスを読む限り、上記形式自体は正当です。

原因は、以下になります。  
mariadb 10.4.6では発生せず、10.4.13では発生するようです。  
なお、cast(created as char)やcast(created as
datetime)にするか、viewの内容の代わりにサブクエリにしても取得できます。  
どこかのバージョンから、viewの挙動が変わったようです。


CC BY-SA 4.0
2020-06-18T03:32:31.960
67776
2020-06-21T20:25:12.050
2020-06-21T20:25:12.050
25396
25396
67771
answer