2

テーブル列の日付を MYSQL 内のリストで生成された日付と比較すると、奇妙な動作が発生するようです。

* SQLFIDDLEリファレンスを参照してください。

給与表:

ID  DATESTAMP
1   August, 30 2012 00:00:00+0000
2   September, 02 2012 00:00:00+0000
3   September, 15 2012 00:00:00+0000
4   September, 24 2012 00:00:00+0000
5   October, 05 2012 00:00:00+0000
6   October, 16 2012 00:00:00+0000
7   October, 19 2012 00:00:00+0000
8   November, 02 2012 00:00:00+0000
9   November, 10 2012 00:00:00+0000
10  November, 16 2012 00:00:00+0000
11  November, 24 2012 00:00:00+0000
12  November, 30 2012 00:00:00+0000
13  December, 01 2012 00:00:00+0000
14  December, 07 2012 00:00:00+0000

日付リストは、一定の日間隔で 2 つの特定の日付の間に生成されます

クエリ:

set @i:= 0;

SELECT date_format(DATE(ADDDATE('2012-10-05', 
INTERVAL @i:=@i+14 DAY)),'%Y-%m-%d')
AS dateP, @i
FROM payroll
HAVING @i < datediff(now(), date '2012-10-05')
;

DATEP          @IntervalDays
2012-10-19     14
2012-11-02     28
2012-11-16     42
2012-11-30     56
2012-12-14     70

ご覧のとおり、生成された日付リストには、上記の Payroll テーブルと一致するものがあります。ただし、比較が完了すると、ゼロ レコードが返されます。

比較クエリ:

set @i:= 0;

SELECT distinct datestamp FROM payroll
WHERE date(datestamp) in (
SELECT DATE(ADDDATE('2012-10-05', 
INTERVAL @i:=@i+14 DAY) ) AS dateP
FROM payroll
where @i < DATEDIFF(now(), date '2012-10-05') 
)
;

だから私が持っている質問

  • ネストされたクエリとして使用された場合、内側のクエリは日付の生成を停止しますか?

  • ここで使用している日付比較方法に問題はありますか?

  • この全体的な失敗の理由は何でしょうか?

  • Select手順/機能なしでそれ自体を修正する方法は? :)

PS:

また、これを SQL サーバーと Oracle でテストしようとしています。

サイトのさまざまなシナリオで発生した「日付比較」の問題をサポートするための多くの優れた質問と回答があります。これには、date_format との mysql 日付比較などの投稿が含まれます。など.. 私が直面している正確な問題を別の言い回しで尋ねているものがどこかに隠されている可能性があります。見つからなかったため、質問を投稿しました。

4

1 に答える 1

1

2回目の更新:

これで、すべてのバージョンで動作するようになりました:

select
*
from
Payroll
inner join 
(
SELECT DATE(DATE_ADD('2012-10-05', 
INTERVAL @i:=@i+14 DAY) ) AS dateP
FROM Payroll, (SELECT @i:=0) r
where @i < DATEDIFF(now(), date '2012-10-05') 
) sq on Payroll.datestamp = sq.dateP

クエリ内で変数を初期化するだけです。

アップデート:

奇妙なことに、これは私のローカル マシン (バージョン 5.1.41-3ubuntu12.7-log) では問題なく動作しますが、SQLfiddle では動作しません。

set @i:= 0;
select
*
from
Payroll
inner join 
(
SELECT DATE(DATE_ADD('2012-10-05', 
INTERVAL @i:=@i+14 DAY) ) AS dateP
FROM Payroll
where @i < DATEDIFF(now(), date '2012-10-05') 
) sq on Payroll.datestamp = sq.dateP

更新の終了

このように試してみましたか?

set @i:= 0;

SELECT distinct datestamp FROM payroll
WHERE STR_TO_DATE(datestamp, '%M, %d %Y %H:%i:%f') in (
SELECT DATE(ADDDATE('2012-10-05', 
INTERVAL @i:=@i+14 DAY) ) AS dateP
FROM payroll
where @i < DATEDIFF(now(), date '2012-10-05') 
)
;

私の推測では、DATE()関数が失敗するのは、 varchar(それは?) 日付が ISO 形式ではないためです。したがって、STR_TO_DATE()関数を使用する必要があります。

STR_TO_DATE()read hereおよびhereの正確な使用法については。マイクロ秒の部分についてはわかりません。

于 2012-12-08T18:04:59.093 に答える