ホームページ データベース mysql チュートリアル [MySQL]--)查询5天之内过生日的同事中的跨年问题的解决过程_MySQL

[MySQL]--)查询5天之内过生日的同事中的跨年问题的解决过程_MySQL

Jun 01, 2016 pm 01:02 PM
誕生日 プロセス

前言:

遇到朋友提问,如下:

SELECT * FROM ali_users WHERE DATEDIFF(CAST(CONCAT(DATE_FORMAT(NOW(),'%y'),DATE_FORMAT(birthday,'-%m-%d'))AS DATE),CAST(DATE_FORMAT(NOW(),'%y-%m-%d') AS DATE))
1,准备测试数据,需要包含跨年的数据

1.1,准备测试数据的SQL

USE test;
DROP TABLE IF EXISTS ali_users;
CREATE TABLE ali_users (username VARCHAR(10),birthday DATE NOT NULL,iphone VARCHAR(16));
INSERT INTO ali_users SELECT \'MaoYi\',\'1985-09-04\',\'13998786543\' UNION ALL
SELECT \'LiuEr\',\'1985-08-30\',\'13998786543\' UNION ALL
SELECT \'ZhangSan\',\'1981-01-01\',\'13998786543\' UNION ALL
SELECT \'LiSi\',\'1983-01-02\',\'13998786543\' UNION ALL
SELECT \'WangWu\',\'1984-11-01\',\'13998786543\' UNION ALL
SELECT \'ZhaoLiu\',\'1984-11-01\',\'13998786543\' UNION ALL
SELECT \'SongQi\',\'1986-08-31\',\'13998786543\' UNION ALL
SELECT \'HuangBa\',\'1989-09-01\',\'13998786543\' UNION ALL
SELECT \'ZengJiu\',\'1989-09-02\',\'13998786543\' UNION ALL
SELECT \'LuoShi\',\'1985-09-03\',\'13998786543\' UNION ALL
SELECT \'Tom\',\'1995-09-05\',\'13998786543\' UNION ALL
SELECT \'Licy\',\'1991-12-30\',\'13998286543\' UNION ALL
SELECT \'Cari\',\'1992-12-31\',\'13998286543\' UNION ALL
SELECT \'Mark\',\'1992-01-03\',\'13998286543\' UNION ALL
SELECT \'Ruby\',\'1992-01-04\',\'13998286547\';
1.2,在数据库命令行执行SQL

mysql> USE test;
DATABASE CHANGED
mysql> DROP TABLE IF EXISTS ali_users;
QUERY OK, 0 ROWS affected (0.00 sec)

mysql> CREATE TABLE ali_users (username VARCHAR(10),birthday DATE NOT NULL,iphone VARCHAR(16));
QUERY OK, 0 ROWS affected (0.01 sec)

mysql> INSERT INTO ali_users SELECT \'MaoYi\',\'1985-09-04\',\'13998786543\' UNION ALL
-> SELECT \'LiuEr\',\'1985-08-30\',\'13998786543\' UNION ALL
-> SELECT \'ZhangSan\',\'1981-01-01\',\'13998786543\' UNION ALL
-> SELECT \'LiSi\',\'1983-01-02\',\'13998786543\' UNION ALL
-> SELECT \'WangWu\',\'1984-11-01\',\'13998786543\' UNION ALL
-> SELECT \'ZhaoLiu\',\'1984-11-01\',\'13998786543\' UNION ALL
-> SELECT \'SongQi\',\'1986-08-31\',\'13998786543\' UNION ALL
-> SELECT \'HuangBa\',\'1989-09-01\',\'13998786543\' UNION ALL
-> SELECT \'ZengJiu\',\'1989-09-02\',\'13998786543\' UNION ALL
-> SELECT \'LuoShi\',\'1985-09-03\',\'13998786543\' UNION ALL
-> SELECT \'Tom\',\'1995-09-05\',\'13998786543\' UNION ALL
-> SELECT \'Licy\',\'1991-12-30\',\'13998286543\' UNION ALL
-> SELECT \'Cari\',\'1992-12-31\',\'13998286543\' UNION ALL
-> SELECT \'Mark\',\'1992-01-03\',\'13998286543\' UNION ALL
-> SELECT \'Ruby\',\'1992-01-04\',\'13998286547\';
QUERY OK, 15 ROWS affected (0.01 sec)
Records: 15 Duplicates: 0 WARNINGS: 0

mysql> SELECT * FROM ali_users;
+----------+------------+-------------+
| username | birthday | iphone |
+----------+------------+-------------+
| MaoYi | 1985-09-04 | 13998786543 |
| LiuEr | 1985-08-30 | 13998786543 |
| ZhangSan | 1981-01-01 | 13998786543 |
| LiSi | 1983-01-02 | 13998786543 |
| WangWu | 1984-11-01 | 13998786543 |
| ZhaoLiu | 1984-11-01 | 13998786543 |
| SongQi | 1986-08-31 | 13998786543 |
| HuangBa | 1989-09-01 | 13998786543 |
| ZengJiu | 1989-09-02 | 13998786543 |
| LuoShi | 1985-09-03 | 13998786543 |
| Tom | 1995-09-05 | 13998786543 |
| Licy | 1991-12-30 | 13998286543 |
| Cari | 1992-12-31 | 13998286543 |
| Mark | 1992-01-03 | 13998286543 |
| Ruby | 1992-01-04 | 13998286547 |
+----------+------------+-------------+
15 ROWS IN SET (0.00 sec)

mysql>
2,写出查询SQL
SELECT * FROM ali_users WHERE
2,1,跨年问题分析
因为跨年的时候生日字段通常月份比较小是1月,所以如果利用DATEDIFF来判断要与月份比较大12月来比较得到相差天数在N天之内的话,就需要YEAR(NOW())+1,当年年份+1再加上月份才能与NOW()比较得出真实的相差天数。
2.2,5天之内的设定
N天之内,用 BETWEEN 0 AND N 来判断,如果是5天之内(包含今天)那么N值就是4,就是 BETWEEN 0 AND 4
3,验证数据
比如提醒最近5天之内(包括今日)过生日的同事,生日快乐。
3.1,查询的数据都在今年之内的,比如今天是8月30日,那么需要执行的SQL如下:
SELECT * FROM ali_users WHERE
查询的结果应该是从今天8月30日到9月3日之间过生日的同事,包括LiuEr,SongQi,HuangBa,ZengJiu,LuoShi;

mysql> SELECT * FROM ali_users WHERE
-> DATEDIFF(CAST(CONCAT(YEAR(NOW()),DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(NOW(),\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
-> OR/* or后面的是捎带解决跨年问题*/
-> DATEDIFF(CAST(CONCAT(YEAR(NOW())+1,DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(NOW(),\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
-> ;
+----------+------------+-------------+
| username | birthday | iphone |
+----------+------------+-------------+
| LiuEr | 1985-08-30 | 13998786543 |
| SongQi | 1986-08-31 | 13998786543 |
| HuangBa | 1989-09-01 | 13998786543 |
| ZengJiu | 1989-09-02 | 13998786543 |
| LuoShi | 1985-09-03 | 13998786543 |
+----------+------------+-------------+
5 ROWS IN SET (0.00 sec)

mysql>
3.2,查询的生日有跨年的
比如今天是2013年12月30日,要查询5天之内过生日的同事,那么就有2013年的12月30日31日过生日的,也有2014年1月1日2日3日过生日的同事,因为今天是8月30日,所以要把Step#2中的SQL的NOW()改成'2013-12-30 00:10:10'来进行测试,SQL整理如下:
mysql> SELECT * FROM ali_users WHERE
-> DATEDIFF(CAST(CONCAT(YEAR(\'2013-12-30 00:10:10\'),DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2013-12-30 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
-> OR/* or后面的是捎带解决跨年问题*/
-> DATEDIFF(CAST(CONCAT(YEAR(\'2013-12-30 00:10:10\')+1,DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2013-12-30 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4
-> ;
+----------+------------+-------------+
| username | birthday | iphone |
+----------+------------+-------------+
| ZhangSan | 1981-01-01 | 13998786543 |
| LiSi | 1983-01-02 | 13998786543 |
| Licy | 1991-12-30 | 13998286543 |
| Cari | 1992-12-31 | 13998286543 |
| Mark | 1992-01-03 | 13998286543 |
+----------+------------+-------------+
5 ROWS IN SET (0.00 sec)

mysql>
4,总结

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

生理不順のない購入局:カレンダーと誕生日シリーズの周辺機器が新登場! 生理不順のない購入局:カレンダーと誕生日シリーズの周辺機器が新登場! Feb 29, 2024 pm 12:00 PM

「失われた購買オフィスは 2 月 28 日午前 11 時に更新されることが確認されています。プレイヤーは淘宝網にアクセスして購買オフィスを検索し、購入するストア カテゴリを選択できます。今回は MBCC 誕生日パーティー シリーズと 2024 卓上カレンダー周辺機器をお届けします。」ぜひ、今回は商品詳細をご覧ください。生理不順のない購入局:カレンダーと誕生日シリーズの周辺機器が新登場!遺失物調達室に新たな出来事が! - 先行販売時間: 2024年2月28日 11:00 - 2024年3月13日 23:59 購入アドレス: 淘宝網検索[予期せぬ紛失購入局] [ストア]カテゴリを選択して購入ストアに入り、周辺機器の紹介: 新しい周辺機器今回発売されるのはMBCCバースデーパーティーシリーズと2024年卓上カレンダー周辺機器です 詳細は長い画像をクリックしてください。購買オフィスが新しい周辺機器を導入 - MBCC の学生

愛と深宇宙 Qi Yu の誕生日をテーマにしたイベントが始まります: 限定の誕生日お祝いプロットを体験してください 愛と深宇宙 Qi Yu の誕生日をテーマにしたイベントが始まります: 限定の誕生日お祝いプロットを体験してください Feb 29, 2024 pm 03:00 PM

「愛と深宇宙」は、3 月 1 日にアップデートして Qi Yu の誕生日テーマイベントを開始することを確認しました. プレイヤーはイベントに参加して、特別な誕生日お祝いプロットを体験できます. さらに、誕生日限定の思考、毎日の服装、20深宇宙を望むクーポンやその他の報酬があなたを待っています。続行して編集者をフォローして、このイベントの詳細を確認してください。愛と深宇宙のQi Yuの誕生日をテーマにしたイベントが始まります: 特別な誕生日プロットを体験してください イベントに参加して、特別な誕生日プロットを体験してください。さらに、誕生日限定の想いや普段着、「深宇宙願い券・期間限定*20」など、多彩な報酬も用意してお待ちしております!開催時間:3月1日アップデート後~3月8日午前4時59分限定ハグ:誕生日5つ星ミス期間限定願いUPイベント期間限定5つ星ミス「Qi Yu・Adventures in this Life」願い確率中期間限定で大幅増量です。 ※イベント終了後の写真です

バック・トゥ・ザ・フューチャー 19996-24の過ごし方 バック・トゥ・ザ・フューチャー 19996-24の過ごし方 Mar 02, 2024 pm 12:58 PM

バック・トゥ・ザ・フューチャー 1999 では、プレイヤーは多くのレベルの課題に直面し、各レベルはまったく異なる課題をもたらします。レベルの 1 つである 6 ~ 24 は、間違いなく多くのプレイヤーがそれについて考えているでしょう。このレベルへの挑戦方法は知っているので、以下に関連するクリアランス方法も示します。バック・トゥ・ザ・フューチャー 19996-24 クリア方法 1. レベル 30 を一言で燃やした後、ボスが気絶するのを待って強打します。 2.メインCと142dを優先して1ラウンドで燃やす。 3. 2ラウンド目は補助と乳母の小スキルでバーンとメインのCカードで大技を組み立てます。 4. ボスは 3 ラウンドで気絶させられ、その後究極の移動スキルとダメージ スキルで直接倒されます。

ミンタイドファンタジーランドの難易度3の攻略方法 ミンタイドファンタジーランドの難易度3の攻略方法 Feb 28, 2024 pm 10:19 PM

Ming Tide Fantasyland 難易度 3 のレベルをクリアする方法を共有します。ミンチャオの多くの人が、このファンタジー ランドのレベル 3 を完了しています。このレベルは実際には少し難しいです。多くの友人はまだ何をすればよいかわかりませんが、心配しないでください。編集者がそれを持ってきます。戦略が載っているので、ぜひ試してみてください。 Ringing Tide Fantasy 難易度 3 をクリアするにはどうすればよいですか? ベルタートル キャラクターの共鳴スキルを強化すると、空力効果が向上します。これにより、攻撃効率が向上し、ダメージが大きくなります。エフェクトの差し替えも可能です。 [メタファー] 最初の 3 つのレベルから選択します: 森の太陽: Ji Yan のダメージを大幅に増加させることができ、スキルをより多く使用すると、非常に優れたクリティカル ヒット効果を生み出すことができます。保護装置: 共振技術を使用

PHPで誕生日をタイムスタンプに変換する実装方法を共有する PHPで誕生日をタイムスタンプに変換する実装方法を共有する Mar 04, 2024 pm 05:54 PM

PHP の誕生日をタイムスタンプに変換する実装方法は日々の開発で共有されていますが、年齢の計算や時刻の比較など、さらに多くの操作を実行するためにユーザーの誕生日をタイムスタンプ形式に変換する必要がある場合があります。この記事では、PHP を使用して誕生日をタイムスタンプに変換する方法と、具体的なコード例を紹介します。 PHP には豊富な日付と時刻の処理関数が用意されており、これらの関数を使用して誕生日をタイムスタンプに変換する操作を完了できます。まず、ユーザーが入力した誕生日を取得する必要があります。これは通常、フォームから取得できます。

C言語で選択ソートの処理を説明する C言語で選択ソートの処理を説明する Sep 01, 2023 pm 01:57 PM

選択ソートは、配列から最小の数値を見つけて最初の位置に配置するために使用される積極的なアルゴリズムです。次に走査される配列は、最小の数値が配置されている場所に近いインデックスから開始されます。選択ソートのプロセスでは、要素のリスト内の最初の最小要素が選択され、それが最初の位置に配置されます。すべての要素が並べ替えられるまで、リスト内の残りの要素に対して同じ操作を繰り返します。次のリストを考えてみましょう - 最初のパス Sm=a[0]=30Sma[1]

win10アップグレードにかかる時間の詳細分析 win10アップグレードにかかる時間の詳細分析 Jan 10, 2024 am 12:00 AM

多くの友人が自分のコンピュータ システムを win10 システムにアップグレードしたいと考えていますが、アップグレード プロセスにどれくらい時間がかかるかわかりません。今日は win10 にアップデートするのに必要な時間について詳しく紹介しました。ぜひご覧ください。 win10 へのアップデートにはどのくらい時間がかかりますか: 1. 各ユーザーのマシンのパフォーマンスに応じて、約 40 分から 2 時間半まで異なります。 2. パフォーマンスを構成する時間も異なります。これは、古いシステムのデータ量に密接に関係しています。 3. コンピューターに多くのものとメカニカル キーボードが搭載されている場合は、さらに遅くなります。 4. win7/8からwin10にアップグレードする場合、約1時間半かかります。 5. 損失を避けるために、アップグレードする前に十分な時間を確保して、重要なものをバックアップしてください。

PHPで誕生日をタイムスタンプに変換するにはどうすればよいですか? PHPで誕生日をタイムスタンプに変換するにはどうすればよいですか? Mar 04, 2024 pm 06:33 PM

PHP は、Web サイトの開発や動的な Web ページの生成によく使用される、人気のあるサーバー側スクリプト言語です。 Web サイトの開発では、ユーザーの誕生日情報の処理が頻繁に行われ、保存または計算のためにユーザーが提供した誕生日をタイムスタンプに変換する必要がある場合があります。ここでは、PHP を使用して誕生日をタイムスタンプに変換する方法と、具体的なコード例を紹介します。まず、誕生日の保存形式を理解する必要があります。誕生日の形式は「1990-05-20」のように「年-月-日」が一般的です。この形式の誕生日データを使用します。

See all articles