數(shù)據(jù)庫Sql實(shí)現(xiàn)截取時(shí)間段和日期實(shí)例(SQL時(shí)間截取)
【寫在前面】
前些日子接到這樣的需求,我們要對(duì)用戶訪問網(wǎng)站的時(shí)間做個(gè)統(tǒng)計(jì),但是我想統(tǒng)計(jì)到具體的時(shí)間點(diǎn),便于統(tǒng)計(jì)不同時(shí)間段(上午、下午、傍晚、凌晨)訪問的人數(shù)占比。
1、原始數(shù)據(jù)查看
那么首先給大家看一下數(shù)據(jù)表的原始數(shù)據(jù):
select id,time,count from bf_visited_address;
由此可見這個(gè)時(shí)間字段是把日期和時(shí)分秒都揉在一起了,但是我只想通過時(shí)分秒來判斷不同時(shí)間段的訪問統(tǒng)計(jì),那么我們寫sql的時(shí)候需要稍加調(diào)整了。
2、 sql實(shí)現(xiàn)日期和時(shí)間點(diǎn)分離(基于MySQL)
核心方法是:DATE_FORMAT() 函數(shù),這個(gè)函數(shù)主要用于不同格式的時(shí)間/日期數(shù)據(jù)
使用語法:DATE_FORMAT(date,format)
date:表示您待處理的時(shí)間值,也就是你在數(shù)據(jù)庫表中展示的字段;
format:表示您要使用的格式,這個(gè)有專門約定的格式,具體的我?guī)_列一下,如下所示
常用的我放在最前面。
常用格式(年月日時(shí)分秒:%Y-%m-%D %H:%i:%s)
格式 | 描述 | 格式 | 描述 |
---|---|---|---|
%T | 時(shí)間, 24-小時(shí) (hh:mm:ss) | %r | 時(shí)間,12-小時(shí)(hh:mm:ss AM 或 PM) |
%Y | 年,4 位(2023) | %y | 年,2 位(23) |
%m | 月,數(shù)值(00-12) | %c | 月,數(shù)值(1-12) |
%d | 日,數(shù)值(00-31) | %e | 日,數(shù)值(0-31) |
%H | 小時(shí) (00-23) | %h或%I | 小時(shí) (01-12) |
%i | 分鐘,數(shù)值(00-59) | %f | 微秒 |
%s | 秒(00-59) | %S | 秒(00-59) |
不常用格式(幾幾年第幾周:%X年 第%V周)
格式 | 描述 | 格式 | 描述 |
---|---|---|---|
%W | 星期名(Thursday) | %w | 周的天 (0=星期日, 6=星期六) |
%a | 縮寫星期名(Thu) | ||
%M | 月名(December) | %b | 縮寫月名(Dec) |
%U | 周 (00-53) 星期日是一周的第一天 | %u | 周 (00-53) 星期一是一周的第一天 |
%V | 周 (01-53) 星期日是一周的第一天,與 %X 使用 | %v | 周 (01-53) 星期一是一周的第一天,與 %x 使用 |
%X | 年,其中的星期日是周的第一天,4 位,與 %V 使用 | %x | 年,其中的星期一是周的第一天,4 位,與 %v 使用 |
3、SQL語句及應(yīng)用場(chǎng)景
A、獲取不同時(shí)間段的數(shù)據(jù)(%T和%H:%i:%s效果一樣)
先轉(zhuǎn)化成HH:mm:ss格式
select id,time,count, DATE_FORMAT(time,'%H:%i:%s') as detailTime from bf_visited_address;
添加時(shí)間過濾條件(過濾條件后面你可以隨便修改)
select * from (select id,time,count, DATE_FORMAT(time,'%T') as detailTime from bf_visited_address) tss where tss.detailTime>'00:00:00' and tss.detailTime<'09:00:00' ORDER BY tss.detailTime asc;
B、獲取日期,不包括時(shí)間點(diǎn)(%Y%m%d)
select id,time,count, DATE_FORMAT(time,'%Y-%m-%d') as detailTime from bf_visited_address;
C、獲取是幾幾年的第幾周(%X%V)
給一個(gè)時(shí)間點(diǎn),sql獲取哪一年的第幾周,此時(shí)將%X和%V做一個(gè)整合即可實(shí)現(xiàn),如下代碼及效果:
select bf_visited_address.*, DATE_FORMAT(time,'%X年第%V周') as detailTime from bf_visited_address;
補(bǔ)充:sql截取日期/時(shí)間的單獨(dú)部分,比如年、月、日、小時(shí)、分鐘等等
可以使用EXTRACT() 函數(shù)。(oracle和mysql都有該函數(shù))
語法:
EXTRACT(unit FROM date)
date 參數(shù)是合法的日期表達(dá)式。unit 參數(shù)可以是下列的值:
YEAR\MONTH\WEEK\DAY\HOUR\MINUTE\SECOND (這里只列出部分常用值)
上面依次代表:年、月、周、日、時(shí)、分、秒
示例:table 表id為1的數(shù)據(jù)有一個(gè)日期類型的字段 createDate 值為 2019-11-12 10:12:33
select EXTRACT(YEAR FROM createDate) as createYear, EXTRACT(MONTH FROM createDate) as createMonth, EXTRACT(DAY FROM createDate) as createDay from table where id = 1
結(jié)果:
createYear -- 2019
createMonth -- 11
createDay -- 12
總結(jié)
到此這篇關(guān)于數(shù)據(jù)庫Sql實(shí)現(xiàn)截取時(shí)間段和日期的文章就介紹到這了,更多相關(guān)Sql截取時(shí)間段和日期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解讀sql中timestamp和datetime之間的轉(zhuǎn)換
這篇文章主要介紹了解讀sql中timestamp和datetime之間的轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12CentOS系統(tǒng)下編譯安裝MySQL以及設(shè)置相關(guān)yum源的教程
這篇文章主要介紹了CentOS系統(tǒng)下編譯安裝MySQL以及設(shè)置相關(guān)yum源的教程,使用RedHat系的Linux系統(tǒng)為環(huán)境的都可以借鑒,需要的朋友可以參考下2015-12-12MySQL: mysql is not running but lock exists 的解決方法
下面可以參考下面的方法步驟解決。最后查到一個(gè)網(wǎng)友說可能和log文件有關(guān),于是將log文件給移除了,再重啟MySQL終于OK了2009-06-06Linux手動(dòng)部署遠(yuǎn)程的mysql數(shù)據(jù)庫的方法詳解
這篇文章主要介紹了Linux手動(dòng)部署遠(yuǎn)程的mysql數(shù)據(jù)庫的方法詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11