1

クエリを作成しようとしていますが、何時間も試行した後、正しく取得できないようです。私がやろうとしているのは、現在の日付と時刻に最も近く、現在の日付と時刻より後のデータベースから 1 つを表示することです。

私の列は次のようになります。

  date         time
1364399654     15:00
1364684400     16:00
1367272800     12:00

私のPHPは次のよ​​うになります:

$timestamp_now = strtotime(date('d-m-Y')); //Creates a timestamp of the currect date
$time_now = date('H:i');
$sql = mysql_query('SELECT * FROM table_name ORDER BY date ASC, time ASC (WHERE date > '.$timestamp_now.') AND (time > "'.$time_now.'") LIMIT 1') or die(mysql_error());
$data = mysql_fetch_array($sql);

ただし、これは機能しません。何かアドバイスはありますか?

4

3 に答える 3

5

PHP の日付/時刻メソッドの使用をやめて、次のようなクエリを提供する MySQL に依存します。

SELECT * FROM table_name 
WHERE date > CURRENT_DATE
OR (
    date = CURRENT_DATE
    AND 
    time > CURRENT_TIME
)
ORDER BY date ASC, time ASC LIMIT 1

OR は、正しいレコードを取得することを確認します。そうしないと、TIME 部分がブロックされます。つまり、現在の時刻が 06:00 の場合、翌日の 03:00 の結果が表示されなくなります。

タイムスタンプ値を使用しているように見えるので、常に CURRENT_DATE の代わりに PHP 日付数値を渡すことができます。これにより、最終的なスクリプトが得られます

$timestamp_now = strtotime(date('d-m-Y')); //Creates a timestamp of the currect date
$sql = mysql_query('SELECT * FROM table_name 
                    WHERE date > '.$timestamp_now.'
                    OR (
                        date = '.$timestamp_now.'
                        AND 
                        time > CURRENT_TIME
                    )
                    ORDER BY date ASC, time ASC LIMIT 1') or die(mysql_error());
$data = mysql_fetch_array($sql);

可能であればデータベースを変更して、MySQL DATETIME フィールドとして保存することを検討することをお勧めします。その後、このクエリを単に に変更できますがWHERE datetime > NOW()、それは完全にあなた次第です。MySQL の日付処理は、PHP よりも論理的であることが常にわかっています。

于 2013-03-27T15:13:20.257 に答える
1

もう 1 つのテストを使用する必要があります。

  • DATE(date) > CURDATE(): 明日以降の場合
  • DATE(date) = CURDATE() AND time > TIME(NOW()):それは今日ですが、後で

完全なコード:

$sql = mysql_query('SELECT * 
                    FROM table_name 
                    WHERE DATE(date) > CURDATE()
                    OR (DATE(date) = CURDATE() AND time > TIME(NOW()))
                    ORDER BY date ASC, time ASC 
                    LIMIT 1'
                  ) or die(mysql_error());
$data = mysql_fetch_array($sql);

フィールドでタイムスタンプを使用していることに注意してくださいdate。タイムスタンプには日付時刻が含まれているため、次のリクエストを使用できる可能性があります。

SELECT * 
FROM table_name 
WHERE date > NOW()
ORDER BY date ASC
LIMIT 1
于 2013-03-27T15:16:03.133 に答える
0

ORDER BY の前に WHERE で構造化された SQL を取得する必要があると思います

SELECT * FROM table WHERE (date>$now) and (time>$now) ORDER BY date,time LIMIT 1
于 2013-03-27T15:11:24.810 に答える