我有一个用户的mysql表,其字段为UserId,Username,Birthdate(格式为YYYY-MM-DD)。我想在我的主页上显示一些内容:
即将到来的生日: 弗雷德史密斯8月24日 比尔琼斯8月27日 Sarah Connor 9月1日 大卫卡西迪9月5日
你明白了 - 它会生成一个简短的列表,列出接下来的生日,忽略年份,仅基于日期和月份。我只是不知道如何进行查询 - 任何帮助都将不胜感激!
答案 0 :(得分:2)
您可以使用mysql DATE_FORMAT()
功能。这应该给你当天和现在7天之间的所有生日:
SELECT username, DATE_FORMAT(Birthdate,'%M %d') as 'birthday' FROM table WHERE DATE_FORMAT(Birthdate,'%m-%d') BETWEEN DATE_FORMAT(CURDATE(),'%m-%d') AND DATE_FORMAT(ADDDATE(NOW(), INTERVAL 7 DAY), '%m-%d') ORDER BY DATE_FORMAT(Birthdate,'%m-%d');
答案 1 :(得分:1)
首先,您需要检索用户列表,如下所示:
$adapter = Zend_Db_Table::getDefaultAdapter()
$table = $adapter->getDbTable()
$select = $table->select();
$select->where('active = ?', true); // if needed
$user = $table->fetchAll($select);
你的getDbTable与Zend Quickstart中的那个非常相似:
public function setDbTable($dbTable)
{
if (is_string($dbTable)) {
$dbTable = new $dbTable();
}
if (! $dbTable instanceof Zend_Db_Table_Abstract) {
throw new Exception('Invalid table provided');
}
$this->_dbTable = $dbTable;
return $this;
}
public function getDbTable()
{
if (null === $this->_dbTable) {
$this->setDbTable('My_Users_DbTable_User');
}
return $this->_dbTable;
}
在My / Users / DbTable / User中包含以下内容的simpla类:
class My_Users_DbTable_User extends Zend_Db_Table_Abstract
{
protected $_name = 'users';
}
最后,当您从数据库中检索数据时,您可以使用current()
和toArray()
方法迭代您提取的每一行。有关详细信息,请参阅Zend_Db_Table_Row documentation。
为了仅显示生日的日期和月份,您可以使用非常有用的Zend_Date。
$date = "1970-12-10";
$d = new Zend_Date($date);
echo $d->toString(Zend_Date::DAY) . " " . $d->toString(Zend_Date::MONTH_NAME_SHORT);
// output: 10 Dec
答案 2 :(得分:1)
另一个选择是创建一个函数,它将位于一个帮助器类中,或者可能进入你的用户类: -
/**
* Fetches a list of birthdays coming up in the following week
* @return array an array user's birthdays
*/
public function getBirthdays()
{
$date = new DateTime();
$date->setTime(0, 0, 1);
$today = $date->getTimestamp();
$week = new DateInterval('P7D');
$date->add($week);
$date->setTime(23, 59, 59);
$nextWeek = $date->getTimestamp();
$select = new Zend_Db_Select(Zend_Db_Table::getDefaultAdapter());
$select ->from('users', array('user_name', 'user_dob'))
->where('user_dob > ?', $today)
->where('user_dob < ?', $nextWeek);
return $select->query()->fetchAll();
}
然后你就做了: -
$birthdays = $classYouMade->getBirthdays();
$html = '';
foreach($birthdays as $bday){
$html .= "Happy Birthday to {$bday['user_name']} on ";
$html .= date('jS F', $bday['user_dob']) . '<br/>';
}
echo $html;
这很长,但是自我记录(我认为),你可以在一年的时间内回来看看,确切地看到发生了什么。
我当然对如何存储日期等做了一些假设(我总是使用unix时间戳),但是如果你想使用它,我相信你可以根据你的用例进行调整。
答案 3 :(得分:0)
您可以使用以下内容进行查询:
SELECT username, birthdate FROM table WHERE birthdate >= beginning_of_week AND birthdate <= end_of_week
您可能需要在您查询的任何脚本中计算所需的周范围。
答案 4 :(得分:0)
您应该能够使用简单的SQL查询获取列表:
select UserId, Username, Birthdate from Users where Birthdate >= CURDATE() and Birthdate <= DATE_ADD(CURDATE(), INTERVAL + 2 WEEK) order by Birthdate ASC
然后,您可以使用PHP中的DateTime :: format()格式化文本。
while ($row = mysql_fetch_assoc($res))
{
$birthday = new DateTime($row['Birthdate']);
print $row['Username']." ".$birthday->format('d M')."\n";
}