1

この MySQL の日付計算の解決策を探して検索を使い果たしました。私のクライアントは、過去 1 週間、1 か月、および 1 年間に行われた取引の数を知りたがっています。

これは SQL ベースのスクリプトです (ただし MySQL 言語で) 私は忙しいので、Select や From などを気にしないでください。datetime_created フィールド (スクリプト内) は既に UnixTime にあり、タイムスタンプ (現在) が使用されています。現在の日付から7日を引いて計算します。数式の結果も負になる可能性があるため、0.01 から 7 の間の結果のみが必要です。

過去 1 週間の私の計算式を以下に示します。何か案は?

(registrations.datetime_created -unix_timestamp(now())-604800)/86400
4

4 に答える 4

2

UNIX_TIMESTAMP / ADDDATE() / の間を使用するのはどうですか?

明確にするためにわずかな拡張を編集します

SELECT
    COUNT(*)
FROM registrations
WHERE registrations.datetime_created
    -- will go back to now() - a month INCLUDING time.  -1 WEEK/MONTH/YEAR etc all works here
    BETWEEN UNIX_TIMESTAMP(ADDDATE(NOW(),INTERVAL -1 WEEK)) 
    AND UNIX_TIMESTAMP(NOW())                                   
    -- will start at now() including time

WHERE 基準内で開始と終了のタイムスタンプを指定することにより、MySQL はdatetime_createdフィールドのインデックス (存在する場合) を使用して、これを非常に効率的に行うことができます。代わりに、WHEREregistrations.datetime_created*1235/12515内に WHERE (フィールドに対する操作) がある場合、返す行を決定するために MySQL がテーブル全体をスキャンする必要があるため、返される速度が遅くなります。

于 2012-04-18T15:30:08.443 に答える
1

これはテストされていませんが、あなたが望むことをすると思います:

SELECT
    q1.dealsInLastWeek,
    q2.dealsInLastMonth,
    q3.dealsInLastYear
FROM
    (SELECT COUNT(*) AS dealsInLastWeek FROM registrations WHERE FROM_UNIXTIME(datetime_created) > DATE_ADD(NOW(), INTERVAL -1 WEEK)) q1,
    (SELECT COUNT(*) AS dealsInLastMonth FROM registrations WHERE FROM_UNIXTIME(datetime_created) > DATE_ADD(NOW(), INTERVAL -1 MONTH)) q2,
    (SELECT COUNT(*) AS dealsInLastYear FROM registrations WHERE FROM_UNIXTIME(datetime_created) > DATE_ADD(NOW(), INTERVAL -1 YEAR)) q3
于 2012-04-18T15:41:25.707 に答える
0

INTERVAL でテストする

SELECT (unix_timestamp(now()-INTERVAL '7' DAY)),(unix_timestamp(now()-INTERVAL '1' MONTH)),(unix_timestamp(now()-INTERVAL '1' YEAR));

WHERE registrations.datetime_created>(unix_timestamp(now()-INTERVAL '7' DAY)) 
于 2012-04-18T15:53:14.767 に答える
0

Where 句はまったく受け入れられず、いくつかのロジックを変更する必要がありました。どうもありがとうございましたが、最終的なスクリプトは全員で作成したもので、次のようになります。

registrations.datetime_created > UNIX_TIMESTAMP(ADDDATE(NOW(),INTERVAL -1 WEEK))
于 2012-04-19T08:04:12.380 に答える