1

私はあなたのために楽しいものを持っています。free_from と free_until の日付列を持つデータベースがあります。私が見つける必要があるのは、現在から今日までの 1 か月間の無料の日数です。たとえば、現在の日付が 2013/01/15 で、列が次のようになっているとします。

free_from | free_until
2013/01/12| 2013/01/17
2013/01/22| 2013/01/26
2013/01/29| 2013/02/04
2013/02/09| 2013/02/11
2013/02/14| 2013/02/17
2013/02/19| 2013/02/30

答えは、2 + 4 + 6 + 2 + 2 + 0 = 16 として 16 になります。

  • 15 日が現在の日付であるため、最初の行は 12 日ではなく 15 日からカウントを開始します。
  • 現在の日付から 1 か月以内の日付がないため、最後の行は割引されます。
  • free_from日付は包括的free_untilで排他的であるため、日付をカウントする必要があります。

どこかで使用されると思いますが、私DATEDIFF()の人生では、これを解決することはできません.

御時間ありがとうございます!

編集: これは PHP mysql_query に入るため、MYSQL で何ができるかについて少し制限される可能性があります。

4

3 に答える 3

2
SET @today = "2013-01-15";
SET @nextm = DATE_ADD(@today, INTERVAL 1 month);
SET @lastd = DATE_ADD(@nextm, INTERVAL 1 day);

SELECT 
 DATEDIFF(
   IF(@lastd> free_until, free_until, @lastd), 
   IF(@today > free_from, @today, free_from)
 )
FROM `test` 
WHERE free_until >= @today AND free_from < @nextm

それはうまくいくはずです。少なくともテストデータについては。でも2013/02/30って何の日?:-)

@today = CURDATE(); を変更することを忘れないでください。

于 2013-01-30T10:53:14.653 に答える
0

私の心の上から...最初に次のことを行います:

SELECT a.free_from AS a_from, a.free_until AS a_until, b.free_from AS b_from
FROM availability a
INNER JOIN availability b ON b.free_from > a.free_until
ORDER BY a_from, b_from

これはおそらく、行間隔ごとに次の間隔、つまりより大きな間隔がある行のセットを返します。結果は戦略的に並べられます。次に、次の方法で結果を部分グループにラップできます。

SELECT * FROM (
SELECT a.free_from AS a_from, a.free_until AS a_until, b.free_from AS b_from
FROM availability a
INNER JOIN availability b ON b.free_from > a.free_until
ORDER BY a_from, b_from
) AS NextInterval
GROUP BY a_from, b_until

上記のクエリで、DATE_DIFF 句を追加します (SUM()必要に応じてラップします)。

DATE_DIFF(b_until, a_from)
于 2013-01-30T12:41:53.833 に答える
0

私が考えることができる最高のものは次のようなものです:

WHERE free_until > CURDATE()
AND free_from < CURDATE() + INTERVAL '1' MONTH

これにより、不要な行が削除されます。次に、最初の行で PHP を実行します。

date_diff(date(), free_until)

最後の行で、次のようにします。

date_diff(free_from, strtotime(date("Y-m-d", strtotime($todayDate)) . "+1 month"))

次に、中間日に次のことを行います。

date_diff(free_from, free_until)

その趣旨の何かですが、これは非常に不格好で複雑に思えます...

于 2013-01-30T10:53:00.613 に答える