1、mysql中跟日期和時(shí)間有關(guān)的函數(shù)。
成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、撫州網(wǎng)絡(luò)推廣、小程序定制開發(fā)、撫州網(wǎng)絡(luò)營(yíng)銷、撫州企業(yè)策劃、撫州品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供撫州建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
2、創(chuàng)建表,并向表中插入數(shù)據(jù)。
3、YEAR的范圍是1901~2155,如果往表中插入2166,則會(huì)報(bào)錯(cuò)。
4、往表中的TIME字段插入數(shù)據(jù)。
5、插入當(dāng)前時(shí)間。
6、插入日期數(shù)據(jù),截取只顯示年月日。
select year(curdate()),month(curdate()),day(curdate());
select weekofyear(curdate());
有點(diǎn)細(xì)微的差別,weekofyear(date)相當(dāng)于week(date,3).
下面是week(date,Mode),取值的說(shuō)明,根據(jù)自己的實(shí)際情況取自己想要的值
Mode 工作日 范圍 Week 1 為第一周 ...
0 周日 0-53 本年度中有一個(gè)周日
1 周一 0-53 本年度中有3天以上
2 周日 1-53 本年度中有一個(gè)周日
3 周一 1-53 本年度中有3天以上
4 周日 0-53 本年度中有3天以上
5 周一 0-53 本年度中有一個(gè)周一
6 周日 1-53 本年度中有3天以上
7 周一 1-53 本年度中有一個(gè)周一
select date_format(now(),'%Y')
select date_format(now(),'%m')
select date_format(now(),'%e')
select date_format(now(),'%U')
select year(curdate()),month(curdate()),dayofyear(curdate()),weekofyear(curdate());
◆ TIME(expr)
提取一個(gè)時(shí)間或日期時(shí)間表達(dá)式的時(shí)間部分,并將其以字符串形式返回。
mysql SELECT TIME('2003-12-31 01:02:03');
- '01:02:03'
mysql SELECT TIME('2003-12-31 01:02:03.000123');
- '01:02:03.000123'
◆ TIMEDIFF(expr,expr2)
TIMEDIFF() 返回起始時(shí)間 expr 和結(jié)束時(shí)間expr2 之間的時(shí)間。 expr 和expr2 為時(shí)間或 date-and-time 表達(dá)式,兩個(gè)的類型必須一樣。
mysql SELECT TIMEDIFF('2000:01:01 00:00:00',
- '2000:01:01 00:00:00.000001');
- '-00:00:00.000001'
mysql SELECT TIMEDIFF('1997-12-31 23:59:59.000001',
- '1997-12-30 01:01:01.000002');
- '46:58:57.999999'
◆ TIMESTAMP(expr) , TIMESTAMP(expr,expr2)
對(duì)于一個(gè)單參數(shù),該函數(shù)將日期或日期時(shí)間表達(dá)式 expr 作為日期時(shí)間值返回.對(duì)于兩個(gè)參數(shù), 它將時(shí)間表達(dá)式 expr2 添加到日期或日期時(shí)間表達(dá)式 expr 中,將theresult作為日期時(shí)間值返回。
mysql SELECT TIMESTAMP('2003-12-31');
- '2003-12-31 00:00:00'
mysql SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00');
- '2004-01-01 00:00:00'
◆ TIMESTAMPADD(interval,int_expr,datetime_expr)
將整型表達(dá)式int_expr 添加到日期或日期時(shí)間表達(dá)式 datetime_expr中。 int_expr 的單位被時(shí)間間隔參數(shù)給定,該參數(shù)必須是以下值的其中一個(gè): FRAC_SECOND、SECOND、 MINUTE、 HOUR、 DAY、 WEEK、 MONTH、 QUARTER或 YEAR。
可使用所顯示的關(guān)鍵詞指定Interval值,或使用SQL_TSI_前綴。例如, DAY或SQL_TSI_DAY 都是正確的。
mysql SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02');
- '2003-01-02 00:01:00'
mysql SELECT TIMESTAMPADD(WEEK,1,'2003-01-02');
- '2003-01-09'
◆ TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)
返回日期或日期時(shí)間表達(dá)式datetime_expr1 和datetime_expr2the 之間的整數(shù)差。其結(jié)果的單位由interval 參數(shù)給出。interval 的法定值同TIMESTAMPADD()函數(shù)說(shuō)明中所列出的相同。
mysql SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');
- 3
mysql SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');
- -1
◆ TIME_FORMAT(time,format)
其使用和 DATE_FORMAT()函數(shù)相同, 然而format 字符串可能僅會(huì)包含處理小時(shí)、分鐘和秒的格式說(shuō)明符。其它說(shuō)明符產(chǎn)生一個(gè)NULL值或0。
若time value包含一個(gè)大于23的小時(shí)部分,則 %H 和 %k 小時(shí)格式說(shuō)明符會(huì)產(chǎn)生一個(gè)大于0..23的通常范圍的值。另一個(gè)小時(shí)格式說(shuō)明符產(chǎn)生小時(shí)值模數(shù)12。
mysql SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l');
- '100 100 04 04 4'
◆ TIME_TO_SEC(time)
返回已轉(zhuǎn)化為秒的time參數(shù)。
mysql SELECT TIME_TO_SEC('22:23:00');
- 80580
mysql SELECT TIME_TO_SEC('00:39:38');
- 2378
◆ TO_DAYS(date)
給定一個(gè)日期date, 返回一個(gè)天數(shù) (從年份0開始的天數(shù) )。
mysql SELECT TO_DAYS(950501);
- 728779
mysql SELECT TO_DAYS('1997-10-07');
- 729669
TO_DAYS() 不用于陽(yáng)歷出現(xiàn)(1582)前的值,原因是當(dāng)日歷改變時(shí),遺失的日期不會(huì)被考慮在內(nèi)。
請(qǐng)記住, MySQL使用“日期和時(shí)間類型”中的規(guī)則將日期中的二位數(shù)年份值轉(zhuǎn)化為四位。例如, '1997-10-07'和 '97-10-07' 被視為同樣的日期:
mysql SELECT TO_DAYS('1997-10-07'), TO_DAYS('97-10-07');
- 729669, 729669
對(duì)于1582 年之前的日期(或許在其它地區(qū)為下一年 ), 該函數(shù)的結(jié)果實(shí)不可靠的。
◆ UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)
若無(wú)參數(shù)調(diào)用,則返回一個(gè)Unix timestamp ('1970-01-01 00:00:00' GMT 之后的秒數(shù)) 作為無(wú)符號(hào)整數(shù)。若用date 來(lái)調(diào)用UNIX_TIMESTAMP(),它會(huì)將參數(shù)值以'1970-01-01 00:00:00' GMT后的秒數(shù)的形式返回。date 可以是一個(gè)DATE 字符串、一個(gè) DATETIME字符串、一個(gè) TIMESTAMP或一個(gè)當(dāng)?shù)貢r(shí)間的YYMMDD 或YYYMMDD格式的數(shù)字。
mysql SELECT UNIX_TIMESTAMP();
- 882226357
mysql SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
- 875996580
當(dāng) UNIX_TIMESTAMP被用在 TIMESTAMP列時(shí), 函數(shù)直接返回內(nèi)部時(shí)戳值, 而不進(jìn)行任何隱含的 “string-to-Unix-timestamp”轉(zhuǎn)化。假如你向UNIX_TIMESTAMP()傳遞一個(gè)溢出日期,它會(huì)返回 0,但請(qǐng)注意只有基本范圍檢查會(huì)被履行 (年份從1970 到 2037, 月份從01到12,日期從 01 到31)。
假如你想要減去 UNIX_TIMESTAMP() 列, 你或許希望刪去帶符號(hào)整數(shù)的結(jié)果。
◆ UTC_DATE, UTC_DATE()
返回當(dāng)前 UTC日期值,其格式為 'YYYY-MM-DD' 或 YYYYMMDD,具體格式取決于函數(shù)是否用在字符串或數(shù)字語(yǔ)境中。
mysql SELECT UTC_DATE(), UTC_DATE() + 0;
- '2003-08-14', 20030814
◆ UTC_TIME, UTC_TIME()
返回當(dāng)前 UTC 值,其格式為 'HH:MM:SS' 或HHMMSS,具體格式根據(jù)該函數(shù)是否用在字符串或數(shù)字語(yǔ)境而定。
mysql SELECT UTC_TIME(), UTC_TIME() + 0;
- '18:07:53', 180753
◆ UTC_TIMESTAMP, UTC_TIMESTAMP()
返回當(dāng)前UTC日期及時(shí)間值,格式為 'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS,具體格式根據(jù)該函數(shù)是否用在字符串或數(shù)字語(yǔ)境而定。
mysql SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
- '2003-08-14 18:08:04', 20030814180804
◆ WEEK(date[,mode])
該函數(shù)返回date 對(duì)應(yīng)的星期數(shù)。WEEK() 的雙參數(shù)形式允許你指定該星期是否起始于周日或周一, 以及返回值的范圍是否為從0 到53 或從1 到53。若 mode參數(shù)被省略,則使用default_week_format系統(tǒng)自變量的值。請(qǐng)參見5.3.3節(jié),“服務(wù)器系統(tǒng)變量”。
以下表說(shuō)明了mode 參數(shù)的工作過程:
mysql SELECT WEEK('1998-02-20');
- 7
mysql SELECT WEEK('1998-02-20',0);
- 7
mysql SELECT WEEK('1998-02-20',1);
- 8
mysql SELECT WEEK('1998-12-31',1);
- 53
注意,假如有一個(gè)日期位于前一年的最后一周, 若你不使用2、3、6或7作為mode 參數(shù)選擇,則MySQL返回 0:
mysql SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
- 2000, 0
有人或許會(huì)提出意見,認(rèn)為 MySQL 對(duì)于WEEK() 函數(shù)應(yīng)該返回 52 ,原因是給定的日期實(shí)際上發(fā)生在1999年的第52周。我們決定返回0作為代替的原因是我們希望該函數(shù)能返回“給定年份的星期數(shù)”。這使得WEEK() 函數(shù)在同其它從日期中抽取日期部分的函數(shù)結(jié)合時(shí)的使用更加可靠。
假如你更希望所計(jì)算的關(guān)于年份的結(jié)果包括給定日期所在周的第一天,則應(yīng)使用 0、2、5或 7 作為mode參數(shù)選擇。
mysql SELECT WEEK('2000-01-01',2);
- 52
作為選擇,可使用 YEARWEEK()函數(shù):
mysql SELECT YEARWEEK('2000-01-01');
- 199952
mysql SELECT MID(YEARWEEK('2000-01-01'),5,2);
- '52'
◆ WEEKDAY(date)
返回date (0 = 周一, 1 = 周二, ... 6 = 周日)對(duì)應(yīng)的工作日索引 weekday index for
mysql SELECT WEEKDAY('1998-02-03 22:23:00');
- 1
mysql SELECT WEEKDAY('1997-11-05');
- 2
◆ WEEKOFYEAR(date)
將該日期的陽(yáng)歷周以數(shù)字形式返回,范圍是從1到53。它是一個(gè)兼容度函數(shù),相當(dāng)于WEEK(date,3)。
mysql SELECT WEEKOFYEAR('1998-02-20');
- 8
◆ YEAR(date)
返回date 對(duì)應(yīng)的年份,范圍是從1000到9999。
mysql SELECT YEAR('98-02-03');
- 1998
◆ YEARWEEK(date), YEARWEEK(date,start)
返回一個(gè)日期對(duì)應(yīng)的年或周。start參數(shù)的工作同 start參數(shù)對(duì) WEEK()的工作相同。結(jié)果中的年份可以和該年的第一周和最后一周對(duì)應(yīng)的日期參數(shù)有所不同。
mysql SELECT YEARWEEK('1987-01-01');
- 198653
注意,周數(shù)和WEEK()函數(shù)隊(duì)可選參數(shù)0或 1可能會(huì)返回的(0) w有所不同,原因是此時(shí) WEEK() 返回給定年份的語(yǔ)境中的周。
以每24小時(shí)作為一份時(shí)間(而非自然日),根據(jù)用戶的配置有兩種工作模式:帶狀模式中,用戶僅定義開始日期時(shí),從開始日期(含)開始,每份時(shí)間1個(gè)分片地?zé)o限增加下去;環(huán)狀模式中,用戶定義了開始日期和結(jié)束日期時(shí),以結(jié)束日期(含)和開始日期(含)之間的時(shí)間份數(shù)作為分片總數(shù)(分片數(shù)量固定),以類似取模的方式路由到這些分片里。
1. DBLE 啟動(dòng)時(shí),讀取用戶在 rule.xml 配置的 sBeginDate 來(lái)確定起始時(shí)間
2. 讀取用戶在 rule.xml 配置的 sPartionDay 來(lái)確定每個(gè) MySQL 分片承載多少天內(nèi)的數(shù)據(jù)
3. 讀取用戶在 rule.xml 配置的 dateFormat 來(lái)確定分片索引的日期格式
4. 在 DBLE 的運(yùn)行過程中,用戶訪問使用這個(gè)算法的表時(shí),WHERE 子句中的分片索引值(字符串),會(huì)被提取出來(lái)嘗試轉(zhuǎn)換成 Java 內(nèi)部的時(shí)間類型
5. 然后求分片索引值與起始時(shí)間的差,除以 MySQL 分片承載的天數(shù),確定所屬分片
1. DBLE 啟動(dòng)時(shí),讀取用戶在 rule.xml 配置的起始時(shí)間 sBeginDate、終止時(shí)間 sEndDate 和每個(gè) MySQL 分片承載多少天數(shù)據(jù) sPartionDay
2. 根據(jù)用戶設(shè)置,建立起以 sBeginDate 開始,每 sPartionDay 天一個(gè)分片,直到 sEndDate 為止的一個(gè)環(huán),把分片串聯(lián)串聯(lián)起來(lái)
3. 讀取用戶在 rule.xml 配置的 defaultNode
4. 在 DBLE 的運(yùn)行過程中,用戶訪問使用這個(gè)算法的表時(shí),WHERE 子句中的分片索引值(字符串),會(huì)被提取出來(lái)嘗試轉(zhuǎn)換成 Java 內(nèi)部的日期類型
5. 然后求分片索引值與起始日期的差:如果分片索引值不早于 sBeginDate(哪怕晚于 sEndDate),就以 MySQL 分片承載的天數(shù)為模數(shù),對(duì)分片索引值求模得到所屬分片;如果分片索引值早于 sBeginDate,就會(huì)被放到 defaultNode 分片上
與MyCat的類似分片算法對(duì)比
中間件
DBLE
MyCat
分片算法種類 date 分區(qū)算法 按日期(天)分片
兩種中間件的取模范圍分片算法使用上無(wú)差別
開發(fā)注意點(diǎn)
【分片索引】1. 必須是字符串,而且 java.text.SimpleDateFormat 能基于用戶指定的 dateFormat 來(lái)轉(zhuǎn)換成 java.util.Date
【分片索引】2. 提供帶狀模式和環(huán)狀模式兩種模式
【分片索引】3. 帶狀模式以 sBeginDate(含)起,以 86400000 毫秒(24 小時(shí)整)為一份,每 sPartionDay 份為一個(gè)分片,理論上分片數(shù)量可以無(wú)限增長(zhǎng),但是出現(xiàn) sBeginDate 之前的數(shù)據(jù)而且沒有設(shè)定 defaultNode 的話,會(huì)路由失?。ㄈ绻?defaultNode,則路由至 defaultNode)
【分片索引】4. 環(huán)狀模式以 86400000 毫秒(24 小時(shí)整)為一份,每 sPartionDay 份為一個(gè)分片,以 sBeginDate(含)到 sEndDate(含)的時(shí)間長(zhǎng)度除以單個(gè)分片長(zhǎng)度得到恒定的分片數(shù)量,但是出現(xiàn) sBeginDate 之前的數(shù)據(jù)而且沒有設(shè)定 defaultNode 的話,會(huì)路由失?。ㄈ绻?defaultNode,則路由至 defaultNode)
【分片索引】5. 無(wú)論哪種模式,分片索引字段的格式化字符串 dateFormat 由用戶指定
【分片索引】6. 無(wú)論哪種模式,劃分不是以日歷時(shí)間為準(zhǔn),無(wú)法對(duì)應(yīng)自然月和自然年,且會(huì)受閏秒問題影響
運(yùn)維注意點(diǎn)
【擴(kuò)容】1. 帶狀模式中,隨著 sBeginDate 之后的數(shù)據(jù)出現(xiàn),分片數(shù)量的增加無(wú)需再平衡
【擴(kuò)容】2. 帶狀模式?jīng)]有自動(dòng)增添分片的能力,需要運(yùn)維手工提前增加分片;如果路由策略計(jì)算出的分片并不存在時(shí),會(huì)導(dǎo)致失敗
【擴(kuò)容】3. 環(huán)狀模式中,如果新舊 [sBeginDate,sEndDate] 之間有重疊,需要進(jìn)行部分?jǐn)?shù)據(jù)遷移;如果新舊 [sBeginDate,sEndDate] 之間沒有重疊,需要數(shù)據(jù)再平衡
配置注意點(diǎn)
【配置項(xiàng)】1. 在 rule.xml 中,可配置項(xiàng)為 propertyname="sBeginDate" 、 propertyname="sPartionDay" 、 propertyname="dateFormat" 、 propertyname="sEndDate" 和 propertyname="defaultNode"
【配置項(xiàng)】2.在 rule.xml 中配置 propertyname="dateFormat",符合 java.text.SimpleDateFormat 規(guī)范的字符串,用于告知 DBLE 如何解析sBeginDate和sEndDate
【配置項(xiàng)】3.在 rule.xml 中配置 propertyname="sBeginDate",必須是符合 dateFormat 的日期字符串
【配置項(xiàng)】4.在 rule.xml 中配置 propertyname="sEndDate",必須是符合 dateFormat 的日期字符串;配置了該項(xiàng)使用的是環(huán)狀模式,若沒有配置該項(xiàng)則使用的是帶狀模式
【配置項(xiàng)】5.在 rule.xml 中配置 propertyname="sPartionDay",非負(fù)整數(shù),該分片策略以 86400000 毫秒(24 小時(shí)整)作為一份,而 sPartionDay 告訴 DBLE 把每多少份放在同一個(gè)分片
【配置項(xiàng)】6.在 rule.xml 中配置 propertyname="defaultNode" 標(biāo)簽,非必須配置項(xiàng),不配置該項(xiàng)的話,用戶的分片索引值沒落在 mapFile 定義
mysql的date屬性,是年-月-日的。
可以用代碼獲取只有月-日格式的日期,如果可以用php的date("m-d")函數(shù),然后再把這個(gè)函數(shù)的返回值插入數(shù)據(jù)庫(kù)