您好,MySql的時(shí)間字段有date、time、datetime、timestamp等,往往我們?cè)诖鎯?chǔ)數(shù)據(jù)的時(shí)候?qū)⒄麄€(gè)時(shí)間存在一個(gè)字段中,采用datetime類(lèi)型;也可能采用將日期和時(shí)間分離,即一個(gè)字段存儲(chǔ)date,一個(gè)字段存儲(chǔ)時(shí)間time。無(wú)論怎么存儲(chǔ),在實(shí)際應(yīng)用中,很可能會(huì)出現(xiàn)包含“時(shí)間段”類(lèi)型的查詢(xún),比如一個(gè)訪問(wèn)記錄數(shù)據(jù)庫(kù),需要統(tǒng)計(jì)每天的訪問(wèn)數(shù)量,這個(gè)每天就是一個(gè)時(shí)間段。下面介紹MySql查詢(xún)時(shí)間段的兩種常見(jiàn)方法,其他數(shù)據(jù)庫(kù)也可以類(lèi)似實(shí)現(xiàn)。
創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的方城網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
方法一:傳統(tǒng)方式,即指定開(kāi)始時(shí)間和結(jié)束時(shí)間,用"between”或者"",""來(lái)建立條件,比如查詢(xún)2010年3月1日到2010年3月2日的數(shù)據(jù)條數(shù),則可以使用
select count(*) from sometable where datetimecolumn='2010-03-01 00:00:00' and datetimecolumn'2010-03-02 00:00:00'
但是,這種方法由于時(shí)間不是整數(shù)型數(shù)據(jù),所以在比較的時(shí)候效率較低,所以如果數(shù)據(jù)量較大,可以將時(shí)間轉(zhuǎn)換為整數(shù)型的UNIX時(shí)間戳,這就是方法二。
方法二:UNIX時(shí)間戳,每個(gè)時(shí)間對(duì)應(yīng)了一個(gè)唯一的UNIX時(shí)間戳,該時(shí)間戳是從'1970-01-01 00:00:00' 為0開(kāi)始計(jì)時(shí),每秒增加1。MySql內(nèi)置了傳統(tǒng)時(shí)間和UNIX時(shí)間的互換函數(shù),分別為:
UNIX_TIMESTAMP(datetime)
FROM_UNIXTIME(unixtime)
比如運(yùn)行
SELECT UNIX_TIMESTAMP('2010-03-01 00:00:00')
返回1267372800
運(yùn)行
SELECT FROM_UNIXTIME(1267372800)
返回'2010-03-01 00:00:00'
于是,我們可以將時(shí)間字段里的數(shù)據(jù)替換為整型的UNIX時(shí)間,這樣,比較時(shí)間就成為整數(shù)比較了,建立索引后能大大提高效率。在查詢(xún)的時(shí)候,需要把起點(diǎn)時(shí)間和結(jié)尾時(shí)間分別轉(zhuǎn)換為UNIX時(shí)間再進(jìn)行比較,如:
select count(*) from sometable where datetimecolumn=UNIX_TIMESTAMP('2010-03-01 00:00:00') and datetimecolumnUNIX_TIMESTAMP('2010-03-02 00:00:00')
也可以在調(diào)用程序中先轉(zhuǎn)換為UNIX時(shí)間再傳入MySql,總之這種方式有利于快速查詢(xún)時(shí)間段,不過(guò)顯示時(shí)間則需要再反轉(zhuǎn)一次。
這個(gè)需要寫(xiě)判斷語(yǔ)句,一條SQL語(yǔ)句很難寫(xiě)出來(lái)??捎么鎯?chǔ)過(guò)程。
需如:
先得到在線時(shí)候一次在線時(shí)間多長(zhǎng)
logintime 2013-1-1 12:00:00 logouttime 2013-1-5 12:00:00
可以先到得 logouttime - logintime = 總的在線時(shí)長(zhǎng)
判斷 總的在線時(shí)長(zhǎng) 得到 如果大于24 或者 得到 2013-1-2 0:00:00 - logintime 小于 總的在線時(shí)長(zhǎng)
2013-1-2 0:00:00 - logintime = 今天在線時(shí)長(zhǎng)
首先我們需要明白SQL語(yǔ)言的局限,它屬于面向集合的描述性語(yǔ)言,該語(yǔ)言無(wú)法在記錄間進(jìn)行瀏覽定位,因此涉及需要進(jìn)行不同記錄間進(jìn)行比較的問(wèn)題時(shí),它會(huì)很無(wú)力。題主這類(lèi)問(wèn)題最好交由應(yīng)用程序端用編程的方法解決,而在數(shù)據(jù)庫(kù)端單純用SQL語(yǔ)言解決則會(huì)相當(dāng)麻煩和低效,很多時(shí)候甚至是無(wú)解的。
下面就題主的問(wèn)題嘗試用純SQL查詢(xún)來(lái)實(shí)現(xiàn),請(qǐng)參考系列實(shí)驗(yàn):
-- 創(chuàng)建測(cè)試表并插入測(cè)試數(shù)據(jù)
DROP TABLE IF EXISTS TEST;
CREATE TABLE TEST (USERID VARCHAR(10),MONTHID INT);
INSERT INTO TEST VALUES
('10001',1),('10002',3),('10003',2),('10002',4),
('10002',3),('10001',2),('10001',3),('10002',12);
-- 查看測(cè)試數(shù)據(jù)
SELECT * FROM ?TEST ;
-- 篩選出曾經(jīng)連續(xù)活躍2個(gè)月和3個(gè)月的用戶(hù)ID
SELECT T.USERID,
CASE WHEN MAX(T.DIFF1)=1 THEN '是' ELSE '否' END AS 連續(xù)活躍兩月,
CASE WHEN MAX(T.DIFF2)=2 THEN '是' ELSE '否' END AS 連續(xù)活躍三月
FROM (SELECT A.*,
(A.MONTHID-(SELECT MAX(MONTHID) FROM TEST WHERE
USERID=A.USERID AND MONTHIDA.MONTHID))
AS DIFF1,
(A.MONTHID-(SELECT MAX(MONTHID) FROM TEST WHERE
USERID=A.USERID AND
MONTHID(SELECT MAX(MONTHID) FROM TEST WHERE
USERID=A.USERID AND MONTHIDA.MONTHID))) AS DIFF2 FROM TEST A) T
WHERE T.DIFF1=1 OR T.DIFF2=2 GROUP BY T.USERID;
DROP TABLE IF EXISTS TEST; ?-- 刪除測(cè)試表
實(shí)驗(yàn)截圖
輸出效果
本文標(biāo)題:mysql活躍時(shí)長(zhǎng)怎么寫(xiě),mysql時(shí)間怎么寫(xiě)
文章地址:http://m.rwnh.cn/article34/dsdhipe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站設(shè)計(jì)、關(guān)鍵詞優(yōu)化、定制開(kāi)發(fā)、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)