2

私はSQLが苦手なので、現在と前の時間、日、月を選択するためにこのステートメントが正しいかどうか知りたいですか?

DATE_SUB(NOW(), INTERVAL '1' HOUR) <= ADDTIME(Datestamp, Timestamp)
DATE_SUB(NOW(), INTERVAL '1' DAY) <= ADDTIME(Datestamp, Timestamp)
DATE_SUB(NOW(), INTERVAL '1' MONTH) <= ADDTIME(Datestamp, Timestamp)

たとえば、現在 14:49 の場合、カウントする必要があります。

  1. すべて 14:00 ~ 15:00 (または 14:49 まで) -DATE_SUB(NOW(), INTERVAL '0' HOUR) <= ADDTIME(Datestamp, Timestamp)
  2. いずれも13:00~14:00DATE_SUB(NOW(), INTERVAL '1' HOUR) <= ADDTIME(Datestamp, Timestamp)

日と月から同じです。たとえば、現在が 2013-01-08 の場合、2013-01-08 と 2013-01-07 をカウントする必要があります。

4

3 に答える 3

6

以下は、MySQL 日付関数を使用して日付を作成する方法の例です。

SELECT 
    NOW() AS CurrentDateTime, 
    DATE_FORMAT(NOW(), '%Y-%m-%d %H:00:00') AS CurrentHour, 
    DATE_FORMAT(NOW(), '%Y-%m-%d %H:00:00') - INTERVAL 1 HOUR AS PreviousHour, 
    CURDATE() AS CurrentDate, 
    CURDATE() - INTERVAL 1 DAY AS PreviousDate, 
    DATE_FORMAT(NOW(), '%Y-%m-01') AS CurrentMonth, 
    DATE_FORMAT(NOW(), '%Y-%m-01') - INTERVAL 1 MONTH AS PreviousMonth

出力:

CurrentDateTime: 2013-01-08 21:00:51
    CurrentHour: 2013-01-08 21:00:00
   PreviousHour: 2013-01-08 20:00:00
    CurrentDate: 2013-01-08
   PreviousDate: 2013-01-07
   CurrentMonth: 2013-01-01
  PreviousMonth: 2012-12-01

そして、ここに使用例があります:

-- SELECT PREVIOUS HOUR ROWS
SELECT *
FROM table1
WHERE ADDTIME(Datestamp, Timestamp) >= DATE_FORMAT(NOW(), '%Y-%m-%d %H:00:00') - INTERVAL 1 HOUR
AND   ADDTIME(Datestamp, Timestamp) <  DATE_FORMAT(NOW(), '%Y-%m-%d %H:00:00')

-- SELECT CURRENT HOUR ROWS
SELECT *
FROM table1
WHERE ADDTIME(Datestamp, Timestamp) >= DATE_FORMAT(NOW(), '%Y-%m-%d %H:00:00')

他の場合も同様です。

于 2013-01-08T16:01:39.897 に答える
3

現在と前の時間:

ADDTIME(Datestamp, Timestamp) BETWEEN ADDDATE(DATE(NOW()), INTERVAL HOUR(NOW())-1 HOURS) AND NOW()

今日プラス昨日:

ADDTIME(Datestamp, Timestamp) BETWEEN DATE(DATE_ADD(DATE(NOW()), INTERVAL -1 DAY)) AND NOW()


編集:個々のクエリを追加

現在の時間 (未来を含む):

ADDTIME(Datestamp, Timestamp) >= ADDDATE(DATE(NOW()), INTERVAL HOUR(NOW()) HOURS)

最後の時間:

DateStamp = DATE(NOW()) AND HOUR(Timestamp) = HOUR(NOW())

当日:

Datestamp = DATE(NOW())

最終日:

Datestamp = DATE(DATE_ADD(NOW(), INTERVAL -1 DAY))
于 2013-01-08T13:21:18.457 に答える
0

現在の時間の始まりを取得する正しい方法は次のとおりです。

SUBDATE(SUBDATE(SUBDATE(NOW(),
        INTERVAL EXTRACT(MICROSECOND FROM NOW()) MICROSECOND),
        INTERVAL EXTRACT(SECOND FROM NOW()) SECOND),
        INTERVAL EXTRACT(MINUTE FROM NOW()) MINUTE))

したがって、完全な時間範囲を取得するには、次のようにします

SUBDATE(SUBDATE(SUBDATE(SUBDATE(NOW(),
        INTERVAL EXTRACT(MICROSECOND FROM NOW()) MICROSECOND),
        INTERVAL EXTRACT(SECOND FROM NOW()) SECOND),
        INTERVAL EXTRACT(MINUTE FROM NOW()) MINUTE),
        INTERVAL 1 HOUR) <= my_date
    AND my_date < SUBDATE(SUBDATE(SUBDATE(NOW(),
        INTERVAL EXTRACT(MICROSECOND FROM NOW()) MICROSECOND),
        INTERVAL EXTRACT(SECOND FROM NOW()) SECOND),
        INTERVAL EXTRACT(MINUTE FROM NOW()) MINUTE)

これは実際には非常に面倒なので、データ型の純度にあまり関心がない場合は、書式設定のトリックを使用して現在の時間を取得します。

STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H') <= my_date
AND my_date <= ADDDATE(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL 1 HOUR)

およびその前の時間:

SUBDATE(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H'), INTERVAL 1 HOUR) <= my_date
AND my_date < STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d%H'), '%Y%m%d%H')

現在の日:

STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d'), '%Y%m%d') <= my_date
AND my_date <= ADDDATE(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d'), '%Y%m%d'), INTERVAL 1 DAY)

そして前日:

SUBDATE(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d'), '%Y%m%d'), INTERVAL 1 DAY) <= my_date
AND my_date < STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m%d'), '%Y%m%d')

現在の月:

STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m'), '%Y%m') <= my_date
AND my_date <= ADDDATE(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m'), '%Y%m'), INTERVAL 1 MONTH)

および前月:

SUBDATE(STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m'), '%Y%m'), INTERVAL 1 MONTH) <= my_date
AND my_date < STR_TO_DATE(DATE_FORMAT(NOW(), '%Y%m'), '%Y%m')
于 2013-01-08T13:57:02.410 に答える