彼らは、誕生日がこれらの日のいずれかであるデータベースユーザーから選択する-サイトのメインページに表示するというタスクを与えました。
PHP(ZF)とMySQLを使用します。
データベースのフィールドのタイプは「日付」で、これはすでに有効です。
タスクは簡単です 、私は書き始めました...
グーグル、ホイールを再発明する理由は、何百回も決定済みだと思います。
私は最初の要求を見ました-それは正しく動作しません、2番目も-
正しいものを見つけましたが、それはとても怪しいことが判明しました。
驚きはありませんでした-これらの「自転車」のいくつかは今年発明されました!
最後に自分で書きました。 開始するには、より簡単です(9月1日から10月29日の誕生日がここで選択されます)。
SELECT * FROM users__accounts WHERE DATE_FORMAT(birthday, '%m%d' ) >= '0901' AND DATE_FORMAT(birthday, '%m%d' ) <= '1029'
* This source code was highlighted with Source Code Highlighter .
ただし、次のN日間の期間を設定する必要があります。 そして、新年の移行はどうですか?
このような何かを書いた:
SET @dayplus:=15;
SET @andor:= CASE WHEN YEAR (CURDATE() + INTERVAL @dayplus DAY ) - YEAR (CURDATE()) THEN 'OR' ELSE 'AND' END ;
SET @fromdate:=DATE_FORMAT(CURDATE(), '%m%d' );
SET @todate:=DATE_FORMAT(CURDATE() + INTERVAL @dayplus DAY , '%m%d' );
SET @birthday_query:=CONCAT(" SELECT * FROM users__accounts WHERE DATE_FORMAT(birthday, '%m%d' ) >= @fromdate ",
@andor, " DATE_FORMAT(birthday, '%m%d' ) <= @todate");
PREPARE birthday_query FROM @birthday_query;
EXECUTE birthday_query;
DEALLOCATE PREPARE archive_query;
* This source code was highlighted with Source Code Highlighter .
SQLプロシージャーを作成するには時期尚早であると判断しました。 さらに、Zend Frameworkで生成されたリクエストはより簡単になります。 それは判明した:
class Users extends Zend_Db_Table_Abstract
{
protected $_name = 'users__accounts' ;
/**
...
*/
public function getBirthdayUsers($count, $days = 7)
{
$date = new Zend_Date();
/* */
$dateFrom = $date->toString( 'MMdd' );
/* ;) */
if ($dateFrom == '0301' && !$date->isLeapYear()) {
$dateFrom = '0229' ;
}
$yearFrom = $date->toString( 'YY' );
$date->addDay($days);
/* + $days */
$dateTo = $date->toString( 'MMdd' );
$nextYear = $yearFrom - $date->toString( 'YY' );
$select = $ this ->getAdapter()->select()
->from(array( 'u' => $ this ->_name))
->where( "date_format(u.birthday,'%m%d') >= ?" , $dateFrom)
->order( 'DAYOFYEAR(u.birthday)' )
->limit($count);
/* - OR / AND */
if ($nextYear == 0) {
$select->where( "date_format(u.birthday,'%m%d') < ?" , $dateTo);
} else {
$select->orWhere( "date_format(u.birthday,'%m%d') < ?" , $dateTo);
}
$users = $select->query()->fetchAll();
return $users;
}
}
* This source code was highlighted with Source Code Highlighter .
定数はリクエスト内で計算されるのではなく、PHPから渡されます。
次に、以前に見つかった自転車の落とし穴をリストします。
1.新しい年への移行は考慮されません
2. DAYOFYEAR()でサンプリングする場合、うるう年は考慮されませんでした-1日間のエラー
3.あいにく、誕生日、たった一度... 4年で
3.複雑すぎる計算
3.極端な日付が落ちた
ZFを使用しない人も役に立つと思います。
SQLクエリ自体は非常に単純であることが判明しましたが、非常に大規模なデータベースの場合は、別のフィールドを用意してインデックスを作成する必要があります。 現在のタスクでは、タイムゾーンは考慮されません。
同時に、PHPで年齢を計算します(MySQLで-さらに簡単に)。 なぜなら 秒単位の計算(リープエラーを伴う)から2ページのコードの「積分」までの実装に対応しました。
/**
* @param timestamp() $birth
* @return INT
*/
function getAge($birth)
{
$now = time();
$age = date( 'Y' , $now) - date( 'Y' , $birth);
if (date( 'md' , $now) < date( 'md' , $birth)) {
$age--;
}
return $age;
}
* This source code was highlighted with Source Code Highlighter .
追伸 より正確な自転車があれば、書いてください。 そして、このタイプの自転車の発明を確実に終わらせます。 :)
あなたがマイナスの場合、コメントから最良のオプションにプラスを入れるか、独自のものを提供します。