-2

この一見非常に単純な mysql クエリに苦労しています。

これは機能しません (有効ですが、行を返しません):

select * from events where type = 'Disposition' AND startDT > '2012-01-01'

次のすべてのクエリは、同じデータに対して機能します。

select * from events where type = 'Eval' AND startDT > '2012-01-01'    
-- (change the value to Eval it works!)

select * from events where type = 'Disposition' AND addedDT > '2012-01-01' 
-- (search a different date field it works!)

select * from events where type = 'Disposition'  
-- (get rid of the AND it works!)

select * from events where startDT > '2012-01-01'   
-- (again, no AND it works!)

私は悪いクエリのバリエーションを試しましたが、それもうまくいきません:

select * from events where `type` = 'Disposition' AND `startDT` > '2012-01-01'
select * from events where `type` = 'Disposition' AND `startDT` > '2012-01-01 00:00:00'
select events.* from events where `type` = 'Disposition' 
    AND `startDT` > '2012-01-01 00:00:00'

(日付のバリエーション、小文字の配置も試しました)

これらのフィールドにはインデックスがなかったので、startDT にインデックスを追加してから、type+startDT (追加された DT には 1 つあり) にインデックスを追加しました。変わりはない。

startDT と addedDT は DATETIME フィールドです。タイプは varchar 30 です

何か案は?

-- これが役立つ場合、説明の出力は次のとおりです。

悪い点:

explain select * FROM `events` WHERE `startDT` > '2012-01-11 00:00:01' AND `type` = "Disposition" limit 1000
"id"    "select_type"   "table" "type"  "possible_keys" "key"   "key_len"   "ref"   "rows"  "Extra"
"1" "SIMPLE"    "events"    "range" "startDT,type"  "type"  "40"    NULL    "1" "Using where"

右側:

explain select * FROM `events` WHERE `type` = "Disposition" limit 1000
"id"    "select_type"   "table" "type"  "possible_keys" "key"   "key_len"   "ref"   "rows"  "Extra"
"1" "SIMPLE"    "events"    "ref"   "type"  "type"  "32"    "const" "13760" "Using where"

左側:

explain select * FROM `events` WHERE `startDT` > '2012-01-11 00:00:01' limit 1000
"id"    "select_type"   "table" "type"  "possible_keys" "key"   "key_len"   "ref"   "rows"  "Extra"
"1" "SIMPLE"    "events"    "range" "startDT"   "startDT"   "8" NULL    "13760" "Using where"

スキーマ:

CREATE TABLE `events` (
    `id` VARCHAR(80) NOT NULL,
    `pk` INT(11) NOT NULL AUTO_INCREMENT,
    `addedDT` DATETIME NOT NULL,
    `type` VARCHAR(30) NOT NULL,
    `startDT` DATETIME NOT NULL,
    PRIMARY KEY (`pk`),
    INDEX `addedDT` (`addedDT`),
    INDEX `startDT` (`startDT`),
    INDEX `type` (`type`, `startDT`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=29407;

サンプル行:

INSERT INTO `events` (`id`, `pk`, `addedDT`, `type`, `startDT`) VALUES ('FBF8CE96-AE86-36C6-3C27-E2AAD042476B', 29406, '2012-12-28 12:59:03', 'Disposition', '2012-12-28 12:59:00');
INSERT INTO `events` (`id`, `pk`, `addedDT`, `type`, `startDT`) VALUES ('12577DB6-9B22-FA73-89BD-E2A5C1764B6D', 29405, '2012-12-28 12:53:32', 'Disposition', '2012-12-28 12:53:00');
4

2 に答える 2

0

where句に日付を追加

WHERE `startDT` >  DATE('2012-01-01')

また

WHERE DATE(`startDT`) >  ('2012-01-01')

http://www.sqlfiddle.com/#!2/4c879/7

同様の投稿がここにあります 日時列から日付を選択するには?

于 2013-01-20T17:28:10.153 に答える
0

startDTはテーブルの日付型です。日付を次のように比較してみてください-

select * from events where `type` = 'Disposition' AND `startDT` > DATE('2012-01-01');
于 2013-01-20T17:11:14.590 に答える