1

特定の日付変数に最も近い日付のレコードを取得する方法はありますか?

例えば:

今日の日付はThursday, 10th January 2012

私のデータベースには、次の水曜日の「来週の」フィクスチャをリストしたいフィクスチャのリストがあります。Wednesday, 16th January 2012

日付列にこれを含むすべての行を出力するファイルを取得するにはどうすればよいですか?

前もって感謝します!

編集

これはサンプルデータを含む私のテーブルです - bowl-track_fixtures:

| fixture_id | league_id | fixture_team_1 | fixture_team_2 | fixture_date             |
---------------------------------------------------------------------------------------
| 1          | 2         | 5              | 6              | Wednesday, 30th January  |
| 2          | 2         | 4              | 1              | Wednesday, 30th January  |
| 3          | 2         | 2              | 3              | Wednesday, 30th January  |
| 1          | 2         | 5              | 6              | Wednesday, 06th February |
| 2          | 2         | 4              | 1              | Wednesday, 06th February |
| 3          | 2         | 2              | 3              | Wednesday, 06th February |

etc..

システムに、今日の日付以降に最も近い行のみを表示してもらいたいです。

私は次のことを試しました。

SELECT * FROM `bowl-track_fixtures` WHERE STR_TO_DATE(`fixture_date`, '%l, %d%S %F %Y') >= NOW() ORDER BY STR_TO_DATE(`fixture_date`, '%l, %d%S %F %Y') LIMIT 1;

ただし、これは結果を返しません

@ニカルス

これは私が使用しているMySQLコードです:

SELECT fixture_id, MIN( STR_TO_DATE(
fixture_date,  '%l, %d%S %F %Y'
) ) AS  `next_fixture_date` 
FROM  `bowl-track_fixtures` 
WHERE STR_TO_DATE(
`fixture_date` ,  '%l, %d%S %F %Y'
) & gt ; = NOW( ) 
GROUP BY  `fixture_id`
)b ON ( a.`fixture_id` = b.`fixture_id` ) 
AND (
STR_TO_DATE(
a.`fixture_date` ,  '%l, %d%S %F %Y'
) = b.`next_fixture_date`
)
LIMIT 0 , 30

そして、これを返します:

MySQL said: 

#1305 - FUNCTION db.STR_TO_DATE does not exist 
4

4 に答える 4

1

使用する

SELECT * FROM table WHERE yourdatecol >= NOW() order by yourdatecol LIMIT 1;
  • order by最新の日付を教えてくれます
  • limit1行のみに制限します。
于 2013-01-10T04:08:24.500 に答える
1

日付が次より大きい場所を選択するだけです:

SELECT * FROM table WHERE STR_TO_DATE(yourdatecol, '%l, %d%S %F %Y') >= NOW() ORDER BY STR_TO_DATE(yourdatecol, '%l, %d%S %F %Y') LIMIT 1;

動作するはずですが、テストされていません

編集: STR_TO_DATE 形式を次のように変更しました%l, %d%S %F %Y

于 2013-01-10T04:03:35.980 に答える
1

これを試してみてはどうですか:

SELECT
    a.*
FROM
    `bowl-track_fixtures` a
JOIN
    (
    SELECT
        fixture_id,
        MIN(STR_TO_DATE(fixture_date, '%l, %d%S %F %Y')) AS next_fixture_date
    FROM
        `bowl-track_fixtures`
    WHERE
        STR_TO_DATE(fixture_date, '%l, %d%S %F %Y') >= NOW()
    GROUP BY
        fixture_id;
    ) b
    ON  (a.fixture_id = b.fixture_id)
    AND (STR_TO_DATE(a.fixture_date, '%l, %d%S %F %Y') = b.next_fixture_date);

これは、フィクスチャの最も近い、より大きな (「次の」) 日付を返します。同じ日付が複数ある場合は、それらを返します。

私が行った2つの仮定なので、これを少し調整する必要がある可能性があります:

  1. 文字列の日付形式。それが正しいことを確認してください。そうしないと、0 レコードを取得する可能性があります。

  2. 「次の」日付を決定する粒度。fixture_id日付の名前が であるため、 にあると思いfixture_dateます。

于 2013-01-10T05:01:49.623 に答える
0

これを試して

SELECT
    DATE_FORMAT(STR_TO_DATE(t.datestring, '%d/%m/%Y'), '%Y-%m-%d') AS ORDER_DATE ,*
FROM t 
WHERE
       DATE_FORMAT(STR_TO_DATE(t.datestring, '%d/%m/%Y'), '%Y-%m-%d') >= NOW()
ORDER BY
       ORDER_DATE DESC
LIMIT 1;

詳細については、==> http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-formatを参照してください。

テスト済みコード

-- --------------------------------------------------------

--
-- Table structure for table `dates`
--

CREATE TABLE IF NOT EXISTS `dates` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

--
-- Dumping data for table `dates`
--

INSERT INTO `dates` (`id`, `date`) VALUES
(1, 'Wednesday, 30th January 2013'),
(2, 'Wednesday, 30th January 2013'),
(3, 'Wednesday, 30th January 2013'),
(4, 'Wednesday, 06th February 2013'),
(5, 'Wednesday, 06th February 2013'),
(6, 'Wednesday, 06th February 2013');

<?php

    $connection = mysql_connect('localhost','root','')or die(mysql_error());
    $database   = mysql_select_db('stackoverflow')or die(mysql_error());

    $query = "SELECT
                STR_TO_DATE(date, '%W, %D %M %Y') AS ORDER_DATE,dates.*
            FROM 
                dates
            WHERE
                STR_TO_DATE(date, '%W, %D %M %Y') >= NOW()
            ORDER BY
                ORDER_DATE ASC
            LIMIT 1;";
    $result = mysql_query($query)or die(mysql_error());
    echo "<table width='100%' border='1'><tr><td>ID</td><td>DATE</td></tr>";
    while($row = mysql_fetch_assoc($result)){
        echo "<tr><td>".$row['id']."</td><td>".$row['ORDER_DATE']."</td></tr>";
    }
    echo "</table>";
?>

mysql の日付文字列に年を追加することを忘れないでください。

于 2013-01-10T04:14:08.177 に答える