<menuitem id="jdrvb"><strike id="jdrvb"></strike></menuitem>
<cite id="jdrvb"></cite>
<cite id="jdrvb"></cite>
<var id="jdrvb"></var>
<cite id="jdrvb"></cite>
<var id="jdrvb"><video id="jdrvb"><menuitem id="jdrvb"></menuitem></video></var><var id="jdrvb"></var>
<cite id="jdrvb"></cite>
<var id="jdrvb"><video id="jdrvb"></video></var>
<cite id="jdrvb"></cite>
<ins id="jdrvb"><span id="jdrvb"><menuitem id="jdrvb"></menuitem></span></ins>
您現在的位置: 弘智首頁 > PHP > MySQL數據庫 >

關于日期的經典SQL編程問題:生日問題

時間:2012-10-31 13:21 來源:弘智培訓

與日期相關的第一個問題是根據某個用戶的出生日期和當前日期,計算他最近的生日。通過對這個問題的處理,演示如何通過使用日期函數來正確處理閏月。

  在生日問題中,一般對閏月的處理如下:如果是閏月,那么返回2月28日;如果不是閏月,則返回3月1日(大部分是出于法律的要求)。例如,當前的日期是2005年9月26日,有人出生在1972年2月29日,查詢后返回的該用戶最近的生日應該是2006年3月1日。如果當前是2007年9月26日,那么查詢后應該返回2008年2月29日。

  在解決該問題之前,運行下列清單中的代碼,初始化一些數據。在演示前,需要確認已經安裝了MySQL官方的示例數據庫employees。

運行結果如下表所示。

關于日期的經典SQL編程問題:生日問題
▲每個員工的生日信息

  下面是該解決方案的SQL查詢:
這個查詢需要a、b、c三個子查詢來完成。第一個子查詢a用來計算每位員工的出生日期與當前日期相差的年份,以及當前的日期。如果只運行子查詢a,將得到如下表所示的輸出,假設當前的日期為“2011-02-04”。
 

關于日期的經典SQL編程問題:生日問題
▲子查詢a的結果

  要計算某員工最近的生日,需要在BirthDay列加上Diff列的年數。如果結果大于當前日期,則年齡需要再加一年。子查詢b增加兩列即Cur和Next,這兩列分別用于表示今年和明年的生日。注意,如果出生日期是2月29日,且目標日期不是閏月,那么這兩列所包含的將是2月28日,而不是3月1日。子查詢b的結果如下表所示。

關于日期的經典SQL編程問題:生日問題
▲子查詢b的結果

  子查詢c用來處理閏月的問題,如果出生的日期為閏月,并且當前的年份不是閏年,則日期加1,表示3月1日為生日。對下一個年份使用同樣的操作,子查詢c的結果如下表所示。

關于日期的經典SQL編程問題:生日問題
▲子查詢c的結果

  最后判斷今年的生日是否已過,如果是,則返回下一年的生日,最后得到的查詢結果如下表所示。

關于日期的經典SQL編程問題:生日問題
▲最后得到的查詢結果

  可以看到Maliniak Kyoichi今年的生日已過,下一個生日是2012年,而David Jiang的生日是3月1日。

  作者簡介

  姜承堯(DavidJiang),《MySQL技術內幕:SQL編程》、《MySQL技術內幕:InnoDB存儲引擎》作者,資深MySQL數據庫專家,MySQL開源分支版本InnoSQL的創始人,獨立數據庫咨詢顧問。不僅擅長于數據庫的管理和維護,還擅長于數據庫的開發,同時一直致力于MySQL數據庫底層實現原理的研究和探索,對高性能數據庫和數據倉庫也有深刻而獨到的理解。目前就職于網易研究院,擔任后臺技術中心技術經理一職,從事MySQL數據庫底層以及云的相關的開發工作

主頁 | 我們介紹 | 我們課程 | 開課公告 | 無錫學歷培訓 | XML地圖
欧美三级电影,欧美大尺度电影
<menuitem id="jdrvb"><strike id="jdrvb"></strike></menuitem>
<cite id="jdrvb"></cite>
<cite id="jdrvb"></cite>
<var id="jdrvb"></var>
<cite id="jdrvb"></cite>
<var id="jdrvb"><video id="jdrvb"><menuitem id="jdrvb"></menuitem></video></var><var id="jdrvb"></var>
<cite id="jdrvb"></cite>
<var id="jdrvb"><video id="jdrvb"></video></var>
<cite id="jdrvb"></cite>
<ins id="jdrvb"><span id="jdrvb"><menuitem id="jdrvb"></menuitem></span></ins>