查询数据库,分解日期以获取年份,并使用唯一年份填充下拉列表

Posted

技术标签:

【中文标题】查询数据库,分解日期以获取年份,并使用唯一年份填充下拉列表【英文标题】:Query database, explode date to get year, and populate dropdown with unique year 【发布时间】:2011-10-23 09:22:10 【问题描述】:

我正在尝试从我的数据库中的表中使用 OPTIONS 填充表单 SELECT。它应该每年显示一次。

例如。如果数据库中的日期字段是 02-09-2010、10-14-2010、08-09-2011:

下拉菜单应显示: 2010 2011

相反,它显示: 2010 2010 2011

我的代码:

$result = mysql_query("SELECT date FROM user_history");

        $yearoptions = "";

        while($row = mysql_fetch_array($result)) 
            $date = $row['date'];
            $yeararray = explode("-", $date);
            $year = array_unique($yeararray);
            $yearoptions .= '<option value="' . $year[2] . '">'
           . $year[2] . '</option>';

谁能看到我做错了什么并提出建议?

【问题讨论】:

【参考方案1】:
$result = mysql_query("SELECT distinct year(date) as years FROM user_history ORDER BY 1 ASC");

<?php while($row = mysql_fetch_array($result))  ?>
  <option value="<?php echo $row['years'];"><?php echo $row['years']; ?></option>
<?php endwhile; ?>

【讨论】:

@nitsuj 关键字“as”将选定的列/值重命名为“years”。您也可以使用表格来做到这一点。 我认为我应该用不同的措辞。我看到它设置为 AS 年,但是 year(date) 如何将年份从 08-09-2011 之类的值中提取出来? @nitsuj 这是一个sql函数,你可以对month()day()做同样的事情。但它只适用于某种日期类型的字段。 这就是问题所在...字段未设置为日期类型。这个解决方案奏效了!谢谢! @nitsuj 不客气 :) 也许你应该看看一些 sql-date-function (w3schools.com/sql/sql_dates.asp),尤其是 now()curdate() 用于写入日期字段在数据库中。【参考方案2】:

SELECT DISTINCT YEAR(date) FROM user_history,也许加上ORDER BY date,会使PHP部分更简单...

【讨论】:

【参考方案3】:

试试:SELECT DISTINCT YEAR(date) FROM user_history

【讨论】:

【参考方案4】:

首先,我建议你在 $row['date'] 上使用 date_parse,类似这样。

$date = date_parse($row['date']);
$year = $date['year'];

年份出现两次的原因是您没有检查冗余。我建议将每年添加到一个数组中并使用 in_array($year, $array) 检查您是否已经添加了它。

【讨论】:

【参考方案5】:

试试:

SELECT DISTINCT YEAR(date) as date FROM user_history ORDER BY date asc

您不需要以这种方式提取年份组件的代码...

您的完整代码是:

$result = mysql_query("SELECT DISTINCT YEAR(date) as date FROM user_history ORDER BY date asc");

        $yearoptions = "";

        while($row = mysql_fetch_array($result)) 
            $date = $row['date'];
            $yearoptions .= '<option value="' . $date . '">'
           . $date . '</option>';

Edite 在将来处理日期/时间时,您可能还会发现以下有用http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

【讨论】:

【参考方案6】:

您没有在输出前一年检查重复项。这是你的基本问题。

您应该首先将可能的年份存储为一个数组,然后根据该数组填充选项。这样,您就不必担心复制。如果您有 11.26.2009、09.01.2010、12.15.2010、06.05.2011,则遍历类似于 $yearOptions = array('2009', '2010', '2011'); 的数组的所有结果;

这里的另一个好处是,如果日期的显示方式出现错误,您只需 var_dump($yearOptions); 即可查看其中显示的内容。

最后,我建议使用strtotime() 而不是explode(),因为它可以接受潜在的非标准日期格式并仍然返回正确的 UNIX 时间戳。然后您可以使用date() 对其进行操作。额外的小奖励:如果您想切换到 '09 而不是 2009,这很简单。

$result = mysql_query("SELECT date FROM user_history");
$yearOptions = array();
while($row = mysql_fetch_array($result)) 
     $date = $row['date'];
     // convert the date to a UNIX timestamp
     $date = strtotime($date);
     // retrieve just the Y (xxxx) from the timestamp
     $year = date('Y', $date)
     // if the year doesn't already exist in the array, add it.
     if(!in_array($year, $yearOptions))  $yearOptions[] = $year; 


foreach($yearsOptions as $year) 
     echo('<option value="' . $year . '">' . $year . '</option>');

希望它有效。

【讨论】:

【参考方案7】:

如上所述,最简单的方法是

SELECT DISTINCT YEAR(date) FROM user_history ORDER BY date

但是如果数据库中的日期不是常规的DATE db类型,则不能应用年份函数,然后需要手动处理。

$result = mysql_query("SELECT date FROM user_history");

$yearoptions = "";
$yearArray = array();
while($row = mysql_fetch_array($result)) 
    $date = $row['date'];
    $yeararray = explode("-", $date);
    array_push($yearArray, $year[2]);

$yearArray = array_unique($yearArray); // Keep only distinct elements
$yearArray = array_sort($yearArray); // To have years in asc order


for(int i=0; i<sizeof($yearArray); i++) 
    $yearoptions .= '<option value="' . $yearArray[i] . '">'. $yearArray[i] . '</option>';

【讨论】:

以上是关于查询数据库,分解日期以获取年份,并使用唯一年份填充下拉列表的主要内容,如果未能解决你的问题,请参考以下文章

使用python从未知日期格式中获取年份

SQL Select 查询以选择日期之间的数据,其中从日期月份高于日期月份和年份差异>1

SQL语句获取日期的月份

Wp查询日期之间的帖子,但任何年份

php按当前年份、季度、当月,查询mysql数据库并输出数组

如何转换日期以仅获取数字年份[重复]