0

データベース システムにを渡すと、ETL「dim_time」という時間ディメンションがあり、テーブルは次のような多くのフィールドで構成されます。

- id
- year
- month
- day
- hour
- week
- day_of_week

私はそのテーブルから id の範囲を取得しようとしており、2 つの日付の間でクエリを実行しています。多くのテストの後、最良のオプションはconcatフィールドと質問<=であると考えました>=。これはクエリです。

SELECT `DimTime`.`id` FROM `dim_time` AS `DimTime` 
  WHERE ((CONCAT(`DimTime`.`year`, "-", `DimTime`.`month`, "-", `DimTime`.`day`, " 00:00:00") >= CONCAT(2013, "-", 10, "-", 9, " 00:00:00")) 
  AND (CONCAT(`DimTime`.`year`, "-", `DimTime`.`month`, "-", `DimTime`.`day`, " 00:00:00") <= CONCAT(2013, "-", 11, "-", 13, " 00:00:00"))) 
  ORDER BY `DimTime`.`year` DESC, `DimTime`.`quarter` DESC, `DimTime`.`month` DESC, `DimTime`.`week` DESC, `DimTime`.`day` DESC, `DimTime`.`hour` DESC

このクエリは、10 月 9 日、および 11 月 1 日から 13 日までのすべての日 (クエリの制限) の行の ID を返します。

10 月の残りの日数が結果に含まれないのはなぜですか? 10 日から 31 日までの日数。

何かを見逃しているのか、それとも日付比較としてMySQL扱うことができないのかはわかりません。concat

4

1 に答える 1

1

のような日付がある場合は機能しますが、有効な日付は であるため、2013-11-13連結された日付が のような場合は日付にキャストする必要があります。2013-1-22013-01-02

とにかく、最善の策は、dim_time テーブルに完全な日付の列を追加することです。特に、これを機能させたとしても、クエリでインデックスを使用できなかったからです。あなたはそれを次のように書く必要があります

WHERE `DimTime`.`year` >= 2013
AND `DimTime`.`month` >= 10
...

その後、インデックスを使用できます。したがって、あなたの人生を楽にして、テーブルに完全な日付列を追加してください。

于 2013-11-13T10:07:47.077 に答える