99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)大數(shù)據(jù)時(shí)代【CDA干貨】SQL 日期截?。簭幕A(chǔ)方法到業(yè)務(wù)實(shí)戰(zhàn)的全維度解析
【CDA干貨】SQL 日期截?。簭幕A(chǔ)方法到業(yè)務(wù)實(shí)戰(zhàn)的全維度解析
2025-09-04
收藏

SQL 日期截?。簭幕A(chǔ)方法到業(yè)務(wù)實(shí)戰(zhàn)的全維度解析

數(shù)據(jù)處理與業(yè)務(wù)分析中,日期數(shù)據(jù)是連接 “業(yè)務(wù)行為” 與 “時(shí)間維度” 的核心紐帶 —— 無(wú)論是統(tǒng)計(jì)月度銷(xiāo)售額、篩選季度活躍用戶(hù),還是清洗格式混亂的時(shí)間戳,都離不開(kāi) “日期截取” 操作。SQL 作為數(shù)據(jù)查詢(xún)與處理的核心語(yǔ)言,提供了適配不同數(shù)據(jù)庫(kù)(MySQLSQL Server、Oracle 等)的日期截取函數(shù),這些函數(shù)看似簡(jiǎn)單,卻直接決定了數(shù)據(jù)統(tǒng)計(jì)的準(zhǔn)確性與效率。本文將從業(yè)務(wù)需求出發(fā),系統(tǒng)梳理 SQL 日期截取的核心方法、典型場(chǎng)景與實(shí)戰(zhàn)技巧,幫助開(kāi)發(fā)者規(guī)避常見(jiàn)誤區(qū),高效處理日期數(shù)據(jù)。

一、為何需要 SQL 日期截?。繕I(yè)務(wù)場(chǎng)景驅(qū)動(dòng)的技術(shù)需求

日期數(shù)據(jù)在數(shù)據(jù)庫(kù)中通常以 “datetime”“date”“timestamp” 等類(lèi)型存儲(chǔ),包含 “年、月、日、時(shí)、分、秒” 甚至毫秒級(jí)信息。但實(shí)際業(yè)務(wù)分析中,往往不需要完整的時(shí)間維度 —— 例如 “統(tǒng)計(jì)每月訂單量” 只需 “年 - 月” 信息,“篩選上周注冊(cè)用戶(hù)” 只需定位 “周” 維度。這種 “從完整日期中提取目標(biāo)時(shí)間單元” 的需求,正是 SQL 日期截取的核心應(yīng)用場(chǎng)景,具體可分為三類(lèi):

(一)統(tǒng)計(jì)分析:按時(shí)間維度聚合數(shù)據(jù)

業(yè)務(wù)中最常見(jiàn)的需求,需按 “日、周、月、季度、年” 等固定時(shí)間單元聚合指標(biāo)(如銷(xiāo)量、用戶(hù)數(shù)、收入)。例如:

  • 電商平臺(tái)需 “按月份統(tǒng)計(jì) 2024 年各品類(lèi)銷(xiāo)售額”,需從訂單表的 “下單時(shí)間(create_time)” 中截取 “年 - 月”;

  • 人力資源系統(tǒng)需 “按季度統(tǒng)計(jì)新員工入職人數(shù)”,需從員工表的 “入職時(shí)間(hire_date)” 中截取 “年 - 季度”。

若不進(jìn)行日期截取,直接對(duì)完整 datetime 字段分組,會(huì)因 “時(shí)分秒” 差異導(dǎo)致同一時(shí)間單元的數(shù)據(jù)被拆分(如 2024-05-01 09:30:00 與 2024-05-01 14:15:00 會(huì)被視為兩個(gè)不同分組),統(tǒng)計(jì)結(jié)果完全失真。

(二)數(shù)據(jù)篩選:精準(zhǔn)定位時(shí)間范圍

在 WHERE 條件中,通過(guò)日期截取可快速篩選特定時(shí)間單元的數(shù)據(jù),避免復(fù)雜的日期范圍計(jì)算。例如:

  • 篩選 “2024 年 3 月所有退款訂單”,無(wú)需寫(xiě)create_time BETWEEN '2024-03-01 00:00:00' AND '2024-03-31 23:59:59',直接截取 “年 - 月” 并匹配 “2024-03” 即可;

  • 定位 “本周內(nèi)登錄過(guò)的用戶(hù)”,通過(guò)截取 “周” 維度,可自動(dòng)適配不同周的日期范圍(無(wú)需手動(dòng)計(jì)算周一至周日的具體日期)。

(三)數(shù)據(jù)清洗:統(tǒng)一日期格式與維度

當(dāng)數(shù)據(jù)庫(kù)中存在格式混亂的日期數(shù)據(jù)(如部分為 “20240520” 字符串,部分為 “2024-05-20 16:40:00” datetime),或需將不同精度的日期統(tǒng)一為相同維度(如將 timestamp 統(tǒng)一為 “年 - 日”)時(shí),日期截取是核心清洗手段。例如:

  • 將字符串格式 “20240520” 轉(zhuǎn)換為 “2024-05-20” 日期類(lèi)型后,截取 “年 - 月” 用于后續(xù)統(tǒng)計(jì);

  • 去除日志表中時(shí)間戳的 “時(shí)分秒”,僅保留 “日期” 維度,減少數(shù)據(jù)冗余。

二、主流數(shù)據(jù)庫(kù)的 SQL 日期截取核心方法:函數(shù)差異與示例

不同數(shù)據(jù)庫(kù)(MySQL、SQL Server、Oracle)的日期截取函數(shù)設(shè)計(jì)不同,但核心邏輯一致 ——“指定目標(biāo)日期字段 + 提取所需時(shí)間單元”。以下梳理各數(shù)據(jù)庫(kù)最常用的截取函數(shù)及典型示例(假設(shè)存在表orders,含字段create_time(datetime 類(lèi)型),存儲(chǔ)訂單創(chuàng)建時(shí)間)。

(一)MySQL:靈活的格式自定義(DATE_FORMAT 與 EXTRACT)

MySQL 中日期截取的核心優(yōu)勢(shì)是支持自定義格式,主要依賴(lài)DATE_FORMAT()函數(shù);若需提取單個(gè)時(shí)間單元(如月份、季度),可使用EXTRACT()函數(shù),操作更簡(jiǎn)潔。

1. DATE_FORMAT (日期字段,格式模板):自定義截取格式

通過(guò)指定格式模板,可提取任意組合的時(shí)間單元,常用模板符號(hào)及示例如下:

格式符號(hào) 含義 示例(針對(duì) 2024-05-20 16:40:30) 函數(shù)調(diào)用與結(jié)果
%Y 4 位年份 2024 DATE_FORMAT(create_time, '%Y') → 2024
%m 2 位月份(01-12) 05 DATE_FORMAT(create_time, '%Y-%m') → 2024-05
%d 2 位日期(01-31) 20 DATE_FORMAT(create_time, '%Y-%m-%d') → 2024-05-20
%H 24 小時(shí)制小時(shí)(00-23) 16 DATE_FORMAT(create_time, '%H:%i') → 16:40
%U 周(周日為一周第一天,00-53) 20 DATE_FORMAT(create_time, '%Y-%U') → 2024-20
%q 季度(1-4) 2 DATE_FORMAT(create_time, '%Y-Q%q') → 2024-Q2

實(shí)戰(zhàn)示例:統(tǒng)計(jì) 2024 年各月訂單量

SELECT 

  DATE_FORMAT(create_time, '%Y-%m') AS order_month,  -- 截取“年-月”作為分組維度

  COUNT(order_id) AS order_count                     -- 統(tǒng)計(jì)每月訂單量

FROM orders

WHERE DATE_FORMAT(create_time, '%Y') = '2024'       -- 篩選2024年數(shù)據(jù)

GROUP BY order_month

ORDER BY order_month;

2. EXTRACT (時(shí)間單元 FROM 日期字段):提取單個(gè)時(shí)間單元

當(dāng)僅需獲取 “月份”“季度” 等單個(gè)維度時(shí),EXTRACT()DATE_FORMAT()更簡(jiǎn)潔,支持的時(shí)間單元包括YEAR(年)、MONTH(月)、QUARTER(季度)、WEEK(周)等。

示例:提取訂單創(chuàng)建時(shí)間的季度與月份

SELECT 

  EXTRACT(YEAR FROM create_time) AS order_year,    -- 提取年份

  EXTRACT(QUARTER FROM create_time) AS order_qtr,  -- 提取季度

  EXTRACT(MONTH FROM create_time) AS order_month   -- 提取月份

FROM orders

LIMIT 10;

(二)SQL Server:精準(zhǔn)的單元提取(DATEPART 與 FORMAT)

SQL Server 的日期截取函數(shù)分為兩類(lèi):DATEPART()用于提取時(shí)間單元的數(shù)值(如月份返回 “5” 而非 “05”),FORMAT()支持自定義格式(類(lèi)似 MySQLDATE_FORMAT()),需根據(jù)場(chǎng)景選擇。

1. DATEPART (時(shí)間單元,日期字段):提取數(shù)值型時(shí)間單元

常用時(shí)間單元參數(shù)及示例(針對(duì) 2024-05-20 16:40:30):

時(shí)間單元參數(shù) 含義 示例結(jié)果 函數(shù)調(diào)用
year 年份 2024 DATEPART(year, create_time)
month 月份 5 DATEPART(month, create_time)
day 日期 20 DATEPART(day, create_time)
week 周(周一為第一天) 21 DATEPART(week, create_time)
quarter 季度 2 DATEPART(quarter, create_time)

實(shí)戰(zhàn)示例:篩選 2024 年第 2 季度的訂單

SELECT order_id, create_time

FROM orders

WHERE 

  DATEPART(year, create_time) = 2024 

  AND DATEPART(quarter, create_time) = 2;  -- 篩選2024年Q2

2. FORMAT (日期字段,格式模板):自定義字符串格式

需注意:FORMAT()返回字符串類(lèi)型,格式模板使用 “yyyy”“MM”“dd” 等符號(hào),與 MySQLDATE_FORMAT()符號(hào)不同。

示例:將創(chuàng)建時(shí)間格式化為 “年 - 月 - 日 時(shí):分”

SELECT 

  order_id,

  FORMAT(create_time, 'yyyy-MM-dd HH:mm') AS formatted_create_time

FROM orders;

(三)Oracle:簡(jiǎn)潔的截?cái)嗯c提?。═RUNC 與 EXTRACT)

Oracle 的日期截取以TRUNC()(截?cái)嗳掌?,保留目?biāo)維度)和EXTRACT()(提取單個(gè)時(shí)間單元)為主,其中TRUNC()是最常用的函數(shù) —— 它會(huì)將截?cái)嗪蟮臅r(shí)間設(shè)為 “00:00:00”,適合日期維度的統(tǒng)一。

1. TRUNC (日期字段,時(shí)間單元):截?cái)嗳掌谥聊繕?biāo)維度

若不指定時(shí)間單元,默認(rèn)截?cái)嘀?“日期”(去除時(shí)分秒);指定單元后,保留該維度及更高維度(如截?cái)嘀?“月”,則保留 “年 - 月”,日設(shè)為 1)。

常用時(shí)間單元及示例(針對(duì) 2024-05-20 16:40:30):

時(shí)間單元 含義 截?cái)嘟Y(jié)果 函數(shù)調(diào)用
'' 默認(rèn)(日期) 2024-05-20 00:00:00 TRUNC(create_time)
'MM' 月份 2024-05-01 00:00:00 TRUNC(create_time, 'MM')
'Q' 季度 2024-04-01 00:00:00 TRUNC(create_time, 'Q')
'YYYY' 年份 2024-01-01 00:00:00 TRUNC(create_time, 'YYYY')
'IW' 周(ISO 標(biāo)準(zhǔn),周一為第一天) 2024-05-20 00:00:00(假設(shè)該日為周一) TRUNC(create_time, 'IW')

實(shí)戰(zhàn)示例:統(tǒng)計(jì) 2024 年各季度訂單總金額

SELECT 

  TRUNC(create_time, 'Q') AS order_qtr,  -- 截?cái)嘀良径龋鳛榉纸M維度

  SUM(order_amount) AS total_amount      -- 統(tǒng)計(jì)季度總金額

FROM orders

WHERE TRUNC(create_time, 'YYYY') = TO_DATE('2024-01-01''YYYY-MM-DD')

GROUP BY order_qtr

ORDER BY order_qtr;

2. EXTRACT (時(shí)間單元 FROM 日期字段):提取單個(gè)單元(與 MySQL 類(lèi)似)

示例:提取訂單創(chuàng)建時(shí)間的年份和月份

SELECT 

  EXTRACT(YEAR FROM create_time) AS order_year,

  EXTRACT(MONTH FROM create_time) AS order_month

FROM orders;

三、SQL 日期截取的實(shí)戰(zhàn)進(jìn)階:復(fù)雜場(chǎng)景與優(yōu)化技巧

基礎(chǔ)截取方法可滿(mǎn)足簡(jiǎn)單需求,但面對(duì) “跨年度周統(tǒng)計(jì)”“動(dòng)態(tài)時(shí)間范圍”“大數(shù)據(jù)量查詢(xún)” 等復(fù)雜場(chǎng)景,需結(jié)合進(jìn)階技巧,兼顧準(zhǔn)確性與效率。

(一)復(fù)雜場(chǎng)景實(shí)戰(zhàn):跨維度與動(dòng)態(tài)截取

1. 跨年度周統(tǒng)計(jì)(如 “2024 年第 1 周包含 2023 年 12 月 31 日”)

不同數(shù)據(jù)庫(kù)對(duì) “周” 的定義不同(如 MySQL%U以周日為一周第一天,Oracle 的IW按 ISO 標(biāo)準(zhǔn)以周一為第一天),需統(tǒng)一周定義避免統(tǒng)計(jì)偏差

MySQL 示例:按 ISO 周統(tǒng)計(jì) 2024 年各周訂單量(ISO 周以周一為第一天,第 1 周至少含 4 天)

SELECT 

  CONCAT(YEAR(create_time), '-W', DATE_FORMAT(create_time, '%v')) AS iso_week,  -- %v表示ISO周

  COUNT(order_id) AS order_count

FROM orders

WHERE DATE_FORMAT(create_time, '%x') = '2024'  -- %x表示ISO周對(duì)應(yīng)的年份

GROUP BY iso_week;

2. 動(dòng)態(tài)時(shí)間范圍(如 “篩選近 3 個(gè)月的訂單”)

無(wú)需手動(dòng)計(jì)算起始日期,通過(guò)DATE_SUB()(MySQL)、DATEADD()SQL Server/Oracle)結(jié)合日期截取實(shí)現(xiàn)動(dòng)態(tài)篩選。

SQL Server 示例:篩選近 3 個(gè)月訂單

SELECT order_id, create_time

FROM orders

WHERE 

  TRUNC(create_time, 'MM') >= TRUNC(DATEADD(month, -3, GETDATE()), 'MM');  -- GETDATE()獲取當(dāng)前時(shí)間

(二)性能優(yōu)化:避免 “函數(shù)失效索引

日期字段若建立索引(如create_time上的索引),直接在 WHERE 條件中對(duì)該字段使用截取函數(shù)(如DATE_FORMAT(create_time, '%Y-%m') = '2024-05'),會(huì)導(dǎo)致索引失效 —— 數(shù)據(jù)庫(kù)無(wú)法直接使用索引查找,需全表掃描,大數(shù)據(jù)量下查詢(xún)緩慢。

優(yōu)化方案:將 “函數(shù)作用于字段” 改為 “字段與目標(biāo)值范圍匹配”,利用索引加速查詢(xún)。

反例(索引失效)

-- MySQL:對(duì)create_time使用函數(shù),索引失效

SELECT * FROM orders WHERE DATE_FORMAT(create_time, '%Y-%m') = '2024-05';

正例(利用索引

-- MySQL:直接匹配日期范圍,索引生效

SELECT * FROM orders 

WHERE create_time BETWEEN '2024-05-01 00:00:00' AND '2024-05-31 23:59:59';

若業(yè)務(wù)中需頻繁按 “年 - 月” 篩選,可在表中新增 “冗余字段order_month(存儲(chǔ) “2024-05” 格式),并建立索引,查詢(xún)時(shí)直接匹配該字段,進(jìn)一步提升效率。

(三)數(shù)據(jù)一致性:處理異常日期格式

當(dāng)日期數(shù)據(jù)為字符串類(lèi)型(如 “20240520”“2024/05/20”)時(shí),需先轉(zhuǎn)換為標(biāo)準(zhǔn) datetime 類(lèi)型,再進(jìn)行截取,避免格式混亂導(dǎo)致的錯(cuò)誤。

MySQL 示例:將字符串 “20240520” 轉(zhuǎn)換為日期并截取 “年 - 月”

SELECT 

  DATE_FORMAT(STR_TO_DATE(order_date_str, '%Y%m%d'), '%Y-%m') AS order_month  -- STR_TO_DATE轉(zhuǎn)換格式

FROM orders_str  -- 表中order_date_str為字符串類(lèi)型

四、常見(jiàn)誤區(qū)與避坑指南

(一)混淆 “時(shí)間單元格式” 導(dǎo)致統(tǒng)計(jì)錯(cuò)誤

  • MySQL%m(2 位月份)與%c(1 位月份,如 5 而非 05)的區(qū)別:若用%c分組,“2024-5” 與 “2024-05” 會(huì)被視為兩個(gè)維度,導(dǎo)致統(tǒng)計(jì)拆分;

  • SQL Server 中FORMAT()返回字符串,若用 “M”(1 位月份)格式化,后續(xù)排序會(huì)出現(xiàn) “2024-1”“2024-10”“2024-2” 的混亂順序,需用 “MM”(2 位月份)確保排序正確。

(二)忽略數(shù)據(jù)庫(kù)時(shí)區(qū)差異

若數(shù)據(jù)庫(kù)啟用了時(shí)區(qū)設(shè)置(如 MySQLtime_zone參數(shù)),NOW()(MySQL)、GETDATE()SQL Server)獲取的當(dāng)前時(shí)間會(huì)受時(shí)區(qū)影響,截取后可能出現(xiàn) “跨天 / 跨月” 偏差。解決方案:統(tǒng)一數(shù)據(jù)庫(kù)時(shí)區(qū)與業(yè)務(wù)時(shí)區(qū),或在截取時(shí)指定時(shí)區(qū)(如 MySQLCONVERT_TZ()函數(shù))。

(三)過(guò)度依賴(lài)函數(shù)而非冗余字段

對(duì)超大規(guī)模表(千萬(wàn)級(jí)以上),頻繁使用日期截取函數(shù)會(huì)增加 CPU 計(jì)算成本。建議對(duì)高頻統(tǒng)計(jì)維度(如 “年 - 月”“季度”)建立冗余字段,通過(guò) ETL 定時(shí)更新,查詢(xún)時(shí)直接使用冗余字段,平衡 “存儲(chǔ)成本” 與 “查詢(xún)效率”。

五、結(jié)語(yǔ):日期截取 ——SQL 數(shù)據(jù)處理的 “時(shí)間標(biāo)尺”

SQL 日期截取看似是基礎(chǔ)操作,實(shí)則是連接 “原始日期數(shù)據(jù)” 與 “業(yè)務(wù)時(shí)間維度” 的核心橋梁。它不僅決定了統(tǒng)計(jì)分析的準(zhǔn)確性(如避免跨時(shí)間單元的數(shù)據(jù)拆分),也影響著查詢(xún)效率(如索引利用與否)。無(wú)論是電商的銷(xiāo)售報(bào)表、金融的交易對(duì)賬,還是互聯(lián)網(wǎng)的用戶(hù)行為分析,都需以精準(zhǔn)的日期截取為前提。

掌握不同數(shù)據(jù)庫(kù)的截取函數(shù)差異、結(jié)合業(yè)務(wù)場(chǎng)景選擇合適的方法、規(guī)避索引失效等誤區(qū),是每個(gè)數(shù)據(jù)從業(yè)者的必備技能。隨著數(shù)據(jù)量的增長(zhǎng)與業(yè)務(wù)復(fù)雜度的提升,日期截取也將從 “單一維度提取” 向 “多維度組合”“動(dòng)態(tài)時(shí)間范圍” 演進(jìn),但核心邏輯始終不變 —— 以 “時(shí)間” 為標(biāo)尺,讓數(shù)據(jù)更精準(zhǔn)地服務(wù)于業(yè)務(wù)決策。

推薦學(xué)習(xí)書(shū)籍 《CDA一級(jí)教材》適合CDA一級(jí)考生備考,也適合業(yè)務(wù)及數(shù)據(jù)分析崗位的從業(yè)者提升自我。完整電子版已上線CDA網(wǎng)校,累計(jì)已有10萬(wàn)+在讀~ !

免費(fèi)加入閱讀:https://edu.cda.cn/goods/show/3151?targetId=5147&preview=0

數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢(xún)
客服在線
立即咨詢(xún)
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶(hù)后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }