2017-11-10 8 views
0

MYSQL(バージョン5.6.37)で次の2つのクエリを実行したときと全く同じテーブルを使用すると、私には意味をなさない非常に異なる結果になります...MySQLで20,000を使用するのがなぜ異なるのですか

SELECT COUNT(*) FROM salesTransactions WHERE date<'2000-01-01' 

(予想通り)159件の結果が得られます。しかし、私は、私は完全に異なる結果を得る同じレポートを実行しますが、20,000年を増やすとき:私は結果6

を取得

SELECT COUNT(*) FROM salesTransactions WHERE date<'20000-01-01' 

をどのようにということは可能ですか?日付を30,000に変更すると、予想される結果が得られます。私は周りに遊んで、20100年には8つの結果があり、それは別の数字です。

表は以下のとおりです。

ID:整数 日:日付 名:VARCHAR(32)

どのようにこれをすることができますか?

+2

この動作を再現できるサンプル・データを使用してSQLのフィドルを作成した方がいいでしょう。私の推測では、あなたの日付フィールドは日付ではなく、varcharなので、mysqlは日付比較とは対照的にテキスト比較を使用しているということです。データがなければ、私の行動は再現できませんでした。 – Shadow

+1

日付フィールドです。 –

+1

DATE型は、日付部分を持ち時間部分を持たない値に使用されます。 MySQLはDATE値を取得して 'YYYY-MM-DD'形式で表示します。サポートされている範囲は '1000-01-01'〜 '9999-12-31'です。 DATETIME型は、日付と時刻の両方の部分を含む値に使用されます。 MySQLはDATETIMEの値を取得し、 'YYYY-MM-DD HH:MM:SS'形式で表示します。サポートされる範囲は '1000-01-01 00:00:00'〜 '9999-12-31 23:59:59'です。 TIMESTAMPデータ型は、日付と時刻の両方の部分を含む値に使用されます。 TIMESTAMPの範囲は '1970-01-01 00:00:01' UTCから '2038-01-19 03:14:07' UTCです。 –

答えて

1

DATE型は、日付部分を持つ値には時間部分は含まれない値に使用されます。 MySQLはDATE値を取得して 'YYYY-MM-DD'形式で表示します。サポートされている範囲は '1000-01-01'〜 '9999-12-31'です。 DATETIME型は、日付と時刻の両方の部分を含む値に使用されます。 MySQLはDATETIMEの値を取得し、 'YYYY-MM-DD HH:MM:SS'形式で表示します。サポートされる範囲は '1000-01-01 00:00:00'〜 '9999-12-31 23:59:59'です。 TIMESTAMPデータ型は、日付と時刻の両方の部分を含む値に使用されます。 TIMESTAMPの範囲は '1970-01-01 00:00:01' UTCから '2038-01-19 03:14:07' UTCです。 (https://dev.mysql.com/doc/refman/5.7/en/datetime.html

興味深いことに、暗黙的な日付変換がnullを返すと予想されるため、クエリは何も返しません。だから少しテストをしました。

Select count(*) from awsalesorderheader 
union all 
select count(*) from awsalesorderheader where orderdate < '9999-01-01' 
union all 
select count(*) from awsalesorderheader where orderdate < '20049-01-01' 
union all 
select count(*) from awsalesorderheader where orderdate < '20050-01-01' 
union all 
select count(*) from awsalesorderheader where orderdate < '20070-01-01' 
union all 
select count(*) from awsalesorderheader where orderdate < '10000-01-01' 
union all 
select count(*) from awsalesorderheader where orderdate < '40000-01-01' 
union all 
select count(*) from awsalesorderheader where orderdate < '30000-01-01' 
union all 
select count(*) from awsalesorderheader where orderdate < null 
; 

+----------+ 
| count(*) | 
+----------+ 
| 31466 | 
| 31466 | 
|  0 | 
|  1379 | 
| 17514 | 
|  0 | 
| 31466 | 
| 31466 | 
|  0 | 
+----------+ 
9 rows in set (0.26 sec) 

お知らせ> 0.私の心はY2Kが離れて行っておりません(たぶん間違った)結論にジャンプし、私はカウントを取得するために開始した後20049-01-01でカットオフがあります。

関連する問題