數(shù)據(jù)庫Sql實(shí)現(xiàn)截取時間段和日期實(shí)例(SQL時間截取)
【寫在前面】
前些日子接到這樣的需求,我們要對用戶訪問網(wǎng)站的時間做個統(tǒng)計,但是我想統(tǒng)計到具體的時間點(diǎn),便于統(tǒng)計不同時間段(上午、下午、傍晚、凌晨)訪問的人數(shù)占比。
1、原始數(shù)據(jù)查看
那么首先給大家看一下數(shù)據(jù)表的原始數(shù)據(jù):
select id,time,count from bf_visited_address;

由此可見這個時間字段是把日期和時分秒都揉在一起了,但是我只想通過時分秒來判斷不同時間段的訪問統(tǒng)計,那么我們寫sql的時候需要稍加調(diào)整了。
2、 sql實(shí)現(xiàn)日期和時間點(diǎn)分離(基于MySQL)
核心方法是:DATE_FORMAT() 函數(shù),這個函數(shù)主要用于不同格式的時間/日期數(shù)據(jù)
使用語法:DATE_FORMAT(date,format)
date:表示您待處理的時間值,也就是你在數(shù)據(jù)庫表中展示的字段;
format:表示您要使用的格式,這個有專門約定的格式,具體的我?guī)_列一下,如下所示
常用的我放在最前面。
常用格式(年月日時分秒:%Y-%m-%D %H:%i:%s)
| 格式 | 描述 | 格式 | 描述 |
|---|---|---|---|
| %T | 時間, 24-小時 (hh:mm:ss) | %r | 時間,12-小時(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 | 小時 (00-23) | %h或%I | 小時 (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)用場景
A、獲取不同時間段的數(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;

添加時間過濾條件(過濾條件后面你可以隨便修改)
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、獲取日期,不包括時間點(diǎn)(%Y%m%d)
select id,time,count, DATE_FORMAT(time,'%Y-%m-%d') as detailTime from bf_visited_address;

C、獲取是幾幾年的第幾周(%X%V)
給一個時間點(diǎn),sql獲取哪一年的第幾周,此時將%X和%V做一個整合即可實(shí)現(xiàn),如下代碼及效果:
select bf_visited_address.*, DATE_FORMAT(time,'%X年第%V周') as detailTime from bf_visited_address;

補(bǔ)充:sql截取日期/時間的單獨(dú)部分,比如年、月、日、小時、分鐘等等
可以使用EXTRACT() 函數(shù)。(oracle和mysql都有該函數(shù))
語法:
EXTRACT(unit FROM date)
date 參數(shù)是合法的日期表達(dá)式。unit 參數(shù)可以是下列的值:
YEAR\MONTH\WEEK\DAY\HOUR\MINUTE\SECOND (這里只列出部分常用值)
上面依次代表:年、月、周、日、時、分、秒
示例:table 表id為1的數(shù)據(jù)有一個日期類型的字段 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)截取時間段和日期的文章就介紹到這了,更多相關(guān)Sql截取時間段和日期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php連接不上mysql但mysql命令行操作正常的解決方法
這篇文章主要介紹了php連接不上mysql但mysql命令行操作正常的解決方法,需要的朋友可以參考下2014-04-04
Slave memory leak and trigger oom-killer
這篇文章主要介紹了Slave memory leak and trigger oom-killer,需要的朋友可以參考下2016-07-07
MySQL多實(shí)例管理如何在一臺主機(jī)上運(yùn)行多個mysql
文章詳解了在Linux主機(jī)上通過二進(jìn)制方式安裝MySQL多實(shí)例的步驟,涵蓋端口配置、數(shù)據(jù)目錄準(zhǔn)備、初始化與啟動流程,以及排錯方法,適用于構(gòu)建讀寫分離架構(gòu),感興趣的朋友一起看看吧2025-07-07
win10下mysql 8.0.11壓縮版安裝詳細(xì)教程
這篇文章主要為大家詳細(xì)介紹了win10下mysql 8.0.11壓縮版安裝詳細(xì)教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
MySQL查詢和篩選存儲的JSON數(shù)據(jù)的操作方法
MySQL是常用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),為了支持非結(jié)構(gòu)化數(shù)據(jù)的存儲和查詢,MySQL引入了對JSON數(shù)據(jù)類型的支持,JSON是一種輕量級的數(shù)據(jù)交換格式,在現(xiàn)代應(yīng)用程序中得到了廣泛應(yīng)用,處理和存儲非結(jié)構(gòu)化數(shù)據(jù)變得越來越重要,本文給大家介紹mysql查詢JSON數(shù)據(jù)的相關(guān)知識,一起看看吧2024-01-01

