2

私は私のアプリケーションの請求書システムに取り組んでいます。2 週間ごとにユーザーに請求したいと考えています。ユーザーが請求書を受け取るかどうかを確認するための cronjob が毎週あります。しかし、それは私にいくつかのバグをもたらします.新年であり、システムは1週間前に請求書を受け取った場合でも誰かに請求書を発行するからです.

これは私のクエリです:

SELECT * 
FROM   user 
WHERE  DAY(registered) = DAY(DATE_SUB(CURDATE(), INTERVAL 2 WEEK))
 OR    DAY(registered) = DAY(NOW()) AND registered != CURRENT_DATE()

ありがとうございました!

4

2 に答える 2

1

あなたはこれを試すことができます-(コードはテストされています)デモ

SELECT * FROM user WHERE registered > CURRENT_DATE() AND 
MOD((FLOOR( DATEDIFF( now( ) , `registered` ))),14) = 0                          
于 2013-01-06T14:07:10.940 に答える
0

MySQLのday関数は日付を返します。期間が月の境界にまたがる場合、クエリに明らかに問題があります。

この形式のロジックが必要だと思います:

SELECT * 
FROM   user 
WHERE  registered >= DATE_SUB(CURDATE(), INTERVAL 2 WEEK)) and
       registered < curdate()

(または<=、現在の日付で請求する場合。)

これが何をしているのかわかりません:

 OR    DAY(registered) = DAY(NOW()) AND registered != CURRENT_DATE()

registered と now() の日付が同じである場合、registered は現在の日付である必要があります。now()との唯一の違いcurdate()は、前者にはタイムスタンプが含まれていることです。また、同じクエリで同じ日付を取得する 3 つの異なる方法を混在させることは、たとえそれらが同等であっても、悪い習慣であるとも言えます。

于 2013-01-06T15:14:49.163 に答える