MySQLで誕生日を選択する+ささいなこと

彼らは、誕生日がこれらの日のいずれかであるデータベースユーザーから選択する-サイトのメインページに表示するというタスクを与えました。

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 .








追伸 より正確な自転車があれば、書いてください。 そして、このタイプの自転車の発明を確実に終わらせます。 :)



あなたがマイナスの場合、コメントから最良のオプションにプラスを入れるか、独自のものを提供します。






All Articles