查询数据库,分解日期以获取年份,并使用唯一年份填充下拉列表
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>';
【讨论】:
以上是关于查询数据库,分解日期以获取年份,并使用唯一年份填充下拉列表的主要内容,如果未能解决你的问题,请参考以下文章
SQL Select 查询以选择日期之间的数据,其中从日期月份高于日期月份和年份差异>1