日付/時刻範囲のデータを選択します


83

MySQLで日付範囲間のデータを選択するにはどうすればよいですか。私のdatetimeコラムは24時間制のzulu時間形式です。

select * from hockey_stats 
where game_date between '11/3/2012 00:00:00' and '11/5/2012 23:59:00' 
order by game_date desc;

これらの期間の間にデータがあるにもかかわらず、何も返しません。'from'および'to'フィールドの値を強制的にdatetimeクエリに入力する必要がありますか?


のデータ型はgame_date何ですか?
hjpotter92 2013

1
その日時。なぜ混乱したのか理解できたと思います。私はmysql用のヒキガエルソフトウェアを使用しています。デフォルトでは、日付範囲で使用した形式で日付がレンダリングされます。そのため、同じものを使用しました。したがって、問題は、範囲内で指定した日付の形式でした。
codingknob

Eugen Rieckが提供する形式を使用すると、期待どおりに機能します。
codingknob

回答:


143

日付形式を更新する必要があります。

select * from hockey_stats 
where game_date between '2012-03-11 00:00:00' and '2012-05-11 23:59:00' 
order by game_date desc;

2
ここではどちらが日付でどちらが月ですか?
アルン2015年

8
日付リテラルの形式は 'YYYY-MM-DD HH:mm:SS'
Eugen Rieck 2015年

13
特にMySQLが1秒未満の時間精度をサポートするようになったため、BETWEENの使用はベストプラクティスではありません。23:59:59を使用することは、1日の終わりより1秒短いことです。 where game_date >= '2012-03-11' and game_date < '2012-05-12'は日付範囲を定義する最も正確な方法であり、日付から1秒未満の単位までのあらゆるレベルの時間精度で機能します。
used_By_Already 2017年

3
@Used_By_Already 2013年にこれに回答したとき、1秒未満のMySQLはありませんでした。23:59から00:00の間に開始し、開始時間が1秒未満のホッケーゲームについてはまだ聞いたことがありません。
Eugen Rieck 2017年

5
このコメントを残したのは、1秒未満の精度でMySQLバージョンを使用している読者向けです。MySQLバージョン5.6.4以降は、小数秒をサポートしています。(日付範囲の対象となるスポーツまたは目的に関係なく。)
Used_By_Already 2017年

19

日付関数を使用する簡単な方法は次のとおりです。

select *
from hockey_stats
where date(game_date) between date('2012-11-03') and date('2012-11-05')
order by game_date desc

7
私は盲目ですか、それともこれはパフォーマンスキラーですか?フィールドではなくdate(game_date)計算された値に対して比較が実行されます。その結果、インデックスは使用されず、すべての行が変更されます(つまり、全表スキャン)。
Eugen Rieck 2013

1
@EugenRieck。。。にインデックスがあると仮定すると、一般的には正しいgame_dateです。インデックスがない場合でも、パフォーマンスの顕著な違いを実現するには、テーブルのサイズを適度に設定する必要があります。名前についての何かは、hockey_statsこれが本当に大きなテーブルではないことを私に示唆しています。
ゴードンリノフ2013

8

簡単な方法:

select  * from  hockey_stats 
where  game_date >= '2012-03-11' and game_date  <= '2012-05-11'

5

おそらくSTR_TO_DATE関数を使用する必要があります。

select * from hockey_stats 
where
  game_date between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
                and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

(game_dateが文字列の場合、STR_TO_DATEを使用する必要がある場合があります)


4

MySQLの日付形式は次のとおりです:YMD。Y / M / Dを使用しています。それは間違っています。クエリを変更します。

Y / M / Dのように日付を挿入すると、データベースにnull値が挿入されます。

PHPを使用していて、フォームから取得する日付がこのY / M / Dのような場合は、これをステートメントを使用して置き換えることができます。

out_date=date('Y-m-d', strtotime(str_replace('/', '-', $data["input_date"])))

4

簡単な方法で、次のように照会できます。

select * from hockey_stats 
where game_date between '2018-01-01' and '2018-01-31';

これは、時間が問題にならない場合に機能します。

時間の考慮も次のように続きます。

select * from hockey_stats where (game_date between '2018-02-05 01:20:00' and '2018-02-05 03:50:00');

これはMySQLサーバー用であることに注意してください。


2

STR_TO_DATE関数を使用して、投稿した形式に基づいて独自の日付パラメーターを渡すことができます。

select * from hockey_stats where game_date 
  between STR_TO_DATE('11/3/2012 00:00:00', '%c/%e/%Y %H:%i:%s')
  and STR_TO_DATE('11/5/2012 23:59:00', '%c/%e/%Y %H:%i:%s') 
order by game_date desc;

または、MySQLが日付YYYY:MM:DD HH:mm:SSを処理する形式を使用して、クエリを次のようにします。

select * from hockey_stats where game_date between '2012-03-11 00:00:00' and'2012-05-11 23:59:00' order by game_date desc;


2

データベースにそのgame_dateデータを挿入する方法について、日付防御を検索する必要があります。たとえば、長い日付または短い日付に日付値を挿入した場合などです。

SELECT * FROM hockey_stats WHERE game_date >= "6/11/2018" AND game_date <= "6/17/2018"

BETWEENを使用することもできます:

SELECT * FROM hockey_stats WHERE game_date BETWEEN "6/11/2018" AND "6/17/2018"

そのような単純な。


私は同じことを試みていますが、それは正しく機能しておらず、ランダムな日付ごとのデータを取得しています。
Manjeet KumarNai19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.