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

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代【CDA干貨】SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實戰(zhàn)優(yōu)化
【CDA干貨】SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實戰(zhàn)優(yōu)化
2025-09-18
收藏

SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實戰(zhàn)優(yōu)化

SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論是報表展示(如 “2024 年 09 月”“09/18/2024”)、數(shù)據(jù)查詢(如篩選 “2024 年 Q3 訂單”),還是數(shù)據(jù)清洗(如將字符串 “20240918” 轉(zhuǎn)為標準日期),都離不開CONVERT函數(shù)。作為 SQL Server 中功能最靈活的日期轉(zhuǎn)換工具,CONVERT不僅支持多種日期格式的相互轉(zhuǎn)換,還能通過style參數(shù)精準控制輸出樣式,解決CAST函數(shù) “格式單一” 的痛點。本文將從函數(shù)原理、核心參數(shù)、實戰(zhàn)案例到常見問題,全面解析CONVERT的日期轉(zhuǎn)換能力,幫助讀者高效處理日期數(shù)據(jù)。

一、基礎(chǔ)認知:CONVERT 函數(shù)的語法與核心作用

CONVERT函數(shù)是 SQL Server 提供的 “類型轉(zhuǎn)換函數(shù)”,其核心作用是 “將一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型”,在日期處理場景中,主要用于 “日期 / 時間類型(如datetime)與字符串類型(如varchar)的相互轉(zhuǎn)換”,或 “不同日期格式的轉(zhuǎn)換”。

1. 核心語法

CONVERT(target_data_type [ (length) ], expression [, style ])

各參數(shù)的含義與日期轉(zhuǎn)換場景的關(guān)聯(lián):

參數(shù) 說明 日期轉(zhuǎn)換場景示例
target_data_type 目標數(shù)據(jù)類型(需轉(zhuǎn)換到的類型) 轉(zhuǎn)為字符串用varchar(20),轉(zhuǎn)為日期用date
length 目標類型的長度(僅字符串類型需要,如varchar(10)),可選 轉(zhuǎn)換為 “YYYY-MM-DD” 需varchar(10)
expression 待轉(zhuǎn)換的表達式(如日期字段、日期字符串) order_date(日期字段)、'20240918'(字符串)
style 日期格式代碼(控制轉(zhuǎn)換后的顯示樣式),可選(默認值為 0 或 100) 23對應(yīng) “YYYY-MM-DD”,101對應(yīng) “MM/DD/YYYY”

2. 與 CAST 函數(shù)的核心區(qū)別

很多人會混淆CONVERTCAST(另一種類型轉(zhuǎn)換函數(shù)),二者在日期轉(zhuǎn)換中的關(guān)鍵差異在于 “格式控制能力”:

  • CAST:僅支持 “類型轉(zhuǎn)換”,不支持自定義日期格式,例如CAST('20240918' AS date)只能轉(zhuǎn)為標準日期類型,無法直接輸出 “MM/DD/YYYY” 格式;

  • CONVERT:通過style參數(shù)支持 30 + 種日期格式,既能轉(zhuǎn)換類型,又能控制顯示樣式,例如CONVERT(varchar(10), '20240918', 101)可直接輸出 “09/18/2024”。

簡言之,若僅需 “簡單類型轉(zhuǎn)換”,CAST足夠;若需 “自定義日期格式”,CONVERT是唯一選擇。

二、核心參數(shù):style 值的分類與常用場景

style參數(shù)是CONVERT日期轉(zhuǎn)換的 “靈魂”—— 不同的style值對應(yīng)不同的日期格式,需根據(jù)業(yè)務(wù)場景(如報表地區(qū)、數(shù)據(jù)接口要求)選擇。以下按 “常用場景” 分類整理高頻style值,方便直接查詢復(fù)用。

1. 標準日期格式(無時間):適用于報表標題、日期篩選

這類style值僅保留 “年 - 月 - 日” 或 “年 / 月 / 日” 格式,無小時、分鐘等時間信息,適合需簡潔日期展示的場景(如訂單日期、注冊日期)。

style 值 格式示例 適用場景 轉(zhuǎn)換示例(以 2024-09-18 為例)
20 yyyy-MM-dd hh:mm:ss(帶時間,常作中間格式) 數(shù)據(jù)庫內(nèi)部日期存儲、接口傳輸 CONVERT(varchar(19), GETDATE(), 20) → '2024-09-18 14:30:00'
23 yyyy-MM-dd 國際標準格式(ISO 8601)、跨系統(tǒng)數(shù)據(jù)交互 CONVERT(varchar(10), GETDATE(), 23) → '2024-09-18'
101 MM/dd/yyyy 美式日期格式(常用于北美報表) CONVERT(varchar(10), GETDATE(), 101) → '09/18/2024'
102 yyyy.MM.dd 歐式日期格式(帶小數(shù)點分隔) CONVERT(varchar(10), GETDATE(), 102) → '2024.09.18'
111 yyyy/MM/dd 中式日期格式(帶斜杠分隔) CONVERT(varchar(10), GETDATE(), 111) → '2024/09/18'

實戰(zhàn)示例:將訂單表order中的create_timedatetime類型)轉(zhuǎn)為 “YYYY-MM-DD” 格式,用于篩選 2024 年 9 月的訂單:

SELECT

   order_id,

   CONVERT(varchar(10), create_time, 23) AS create_date  -- 轉(zhuǎn)為標準日期字符串

FROM

   [order]

WHERE

   CONVERT(varchar(7), create_time, 23) = '2024-09';  -- 篩選2024年9月(格式:YYYY-MM)

2. 日期 + 時間格式:適用于精確時間記錄

這類style值保留 “日期 + 小時:分鐘:秒”,甚至包含毫秒,適合需精確時間的場景(如日志記錄、交易時間戳)。

style 值 格式示例 適用場景 轉(zhuǎn)換示例(以 2024-09-18 14:30:45.123 為例)
120 yyyy-MM-dd HH:mm:ss 24 小時制標準格式(無毫秒) CONVERT(varchar(19), GETDATE(), 120) → '2024-09-18 14:30:45'
121 yyyy-MM-dd HH:mm:ss.sss 24 小時制帶毫秒(高精度場景) CONVERT(varchar(23), GETDATE(), 121) → '2024-09-18 14:30:45.123'
100 mon dd yyyy hh:mmAM/PM 帶月份縮寫 + 12 小時制(美式報表) CONVERT(varchar(20), GETDATE(), 100) → 'Sep 18 2024 02:30PM'
109 mon dd yyyy hh:mm:ss:mmmAM/PM 帶月份縮寫 + 毫秒 + 12 小時制 CONVERT(varchar(25), GETDATE(), 109) → 'Sep 18 2024 02:30:45:123PM'

實戰(zhàn)示例:查詢系統(tǒng)日志表sys_log中 “2024-09-18 14:00 至 14:30” 的操作記錄,需精確到分鐘:

SELECT

   log_id,

   operator,

   CONVERT(varchar(19), log_time, 120) AS log_time_str  -- 轉(zhuǎn)為帶時間的標準格式

FROM

   sys_log

WHERE

   log_time BETWEEN

       CONVERT(datetime, '2024-09-18 14:00:00', 120)  -- 字符串轉(zhuǎn)日期時間

       AND

       CONVERT(datetime, '2024-09-18 14:30:00', 120);

3. 特殊格式:適用于特定業(yè)務(wù)需求

這類style值包含 “純數(shù)字日期”“星期”“季度” 等特殊信息,適合個性化場景(如訂單編號生成、季度統(tǒng)計)。

style 值 格式示例 適用場景 轉(zhuǎn)換示例(以 2024-09-18 為例)
112 yyyymmdd 純數(shù)字日期(無分隔符,用于訂單編號) CONVERT(varchar(8), GETDATE(), 112) → '20240918'
113 dd mon yyyy HH:mm:ss 帶日、月份縮寫(歐式報表) CONVERT(varchar(20), GETDATE(), 113) → '18 Sep 2024 14:30:45'
130 dd mon yyyy HH:mm:ss(阿拉伯語格式) 多語言場景 CONVERT(varchar(20), GETDATE(), 130) → '18 ???? 1446 14:30:45'(需切換語言)
106 dd mon yyyy 日 - 月縮寫 - 年(簡潔報表) CONVERT(varchar(12), GETDATE(), 106) → '18 Sep 2024'

實戰(zhàn)示例:生成 “日期 + 訂單號” 的唯一編號(如 “20240918-10001”),需用純數(shù)字日期:

SELECT

   'ORD-' + CONVERT(varchar(8), GETDATE(), 112) + '-' + CAST(order_id AS varchar(10)) AS order_no

FROM

   [order]

WHERE

   order_id = 10001;

-- 輸出:'ORD-20240918-10001'

三、實戰(zhàn)場景:CONVERT 日期轉(zhuǎn)換的典型應(yīng)用

CONVERT的日期轉(zhuǎn)換能力在實際業(yè)務(wù)中應(yīng)用廣泛,以下結(jié)合 “數(shù)據(jù)查詢”“報表生成”“數(shù)據(jù)清洗” 三大核心場景,提供可直接復(fù)用的解決方案。

1. 場景 1:日期字符串轉(zhuǎn)日期類型 —— 解決 “字符串無法篩選” 問題

業(yè)務(wù)中常遇到 “日期以字符串形式存儲”(如varchar類型的 '20240918'),需轉(zhuǎn)為datedatetime類型才能進行范圍查詢(如 “篩選 9 月訂單”)。

問題:直接用字符串篩選varchar類型的日期字段,可能出現(xiàn)邏輯錯誤(如 '202409' > '202410',因字符串按字典序比較);

解決方案:用CONVERT將字符串轉(zhuǎn)為date類型,再進行篩選。

代碼示例

-- 原始表:user_register,register_date字段為varchar(8),存儲格式'20240918'

SELECT

   user_id,

   CONVERT(date, register_date, 112) AS register_date  -- 字符串轉(zhuǎn)date類型

FROM

   user_register

WHERE

   -- 轉(zhuǎn)為date類型后篩選“2024年9月注冊的用戶”

   CONVERT(date, register_date, 112) BETWEEN '2024-09-01' AND '2024-09-30';

2. 場景 2:報表中自定義日期格式 —— 適配不同地區(qū)需求

不同地區(qū)的報表對日期格式要求不同(如北美用 “MM/DD/YYYY”,歐洲用 “DD/MM/YYYY”),需用CONVERTstyle參數(shù)快速切換格式。

需求:生成面向北美市場的 “9 月銷售報表”,日期格式需為 “MM/DD/YYYY”,并顯示星期;

解決方案:結(jié)合style=101(MM/DD/YYYY)與DATENAME函數(shù)(獲取星期)。

代碼示例

SELECT

   CONVERT(varchar(10), sale_date, 101) AS sale_date_str,  -- 北美格式日期

   DATENAME(weekday, sale_date) AS sale_weekday,  -- 獲取星期(如'Monday'

   SUM(sale_amount) AS total_sale  -- 當日銷售額

FROM

   sales

WHERE

   CONVERT(varchar(7), sale_date, 23) = '2024-09'  -- 篩選9月數(shù)據(jù)

GROUP BY

   sale_date

ORDER BY

   sale_date;

3. 場景 3:數(shù)據(jù)清洗 —— 處理不規(guī)則日期字符串

業(yè)務(wù)系統(tǒng)導(dǎo)入的數(shù)據(jù)中,日期字符串格式可能不統(tǒng)一(如同時存在 '2024-09-18'、'09/18/2024'、'20240918'),需用CONVERT統(tǒng)一轉(zhuǎn)為標準日期類型。

問題:不同格式的字符串直接插入date字段會報錯;

解決方案:根據(jù)字符串格式選擇對應(yīng)的style值,批量轉(zhuǎn)換為date類型。

代碼示例

-- 原始表:dirty_data,mixed_date字段為varchar(20),格式不規(guī)則

SELECT

   mixed_date,

   -- 按不同格式匹配轉(zhuǎn)換

   CASE

       WHEN mixed_date LIKE '____-__-__' THEN CONVERT(date, mixed_date, 23)  -- 匹配'YYYY-MM-DD'

       WHEN mixed_date LIKE '__/__/____' THEN CONVERT(date, mixed_date, 101)  -- 匹配'MM/DD/YYYY'

       WHEN mixed_date LIKE '________' THEN CONVERT(date, mixed_date, 112)    -- 匹配'YYYYMMDD'

       ELSE NULL  -- 無法識別的格式設(shè)為NULL,后續(xù)人工處理

   END AS clean_date

FROM

   dirty_data;

4. 場景 4:動態(tài)日期范圍查詢 —— 獲取 “近 7 天”“本月” 數(shù)據(jù)

需根據(jù)當前日期動態(tài)篩選數(shù)據(jù)(如 “近 7 天訂單”“本月新增用戶”),需用CONVERT結(jié)合GETDATE()(獲取當前日期)實現(xiàn)。

需求:查詢 “近 7 天(含今日)的支付訂單”,日期格式統(tǒng)一為 “YYYY-MM-DD”;

解決方案:用DATEADD計算 7 天前的日期,結(jié)合CONVERT轉(zhuǎn)換格式。

代碼示例

SELECT

   order_id,

   CONVERT(varchar(10), pay_time, 23) AS pay_date,

   pay_amount

FROM

   [order]

WHERE

   pay_time BETWEEN

       CONVERT(datetime, CONVERT(varchar(10), DATEADD(day, -6, GETDATE()), 23) + ' 00:00:00', 20)  -- 7天前0點

       AND

       CONVERT(datetime, CONVERT(varchar(10), GETDATE(), 23) + ' 23:59:59', 20);  -- 今日23點59分

四、常見錯誤與優(yōu)化技巧:避免踩坑,提升效率

使用CONVERT進行日期轉(zhuǎn)換時,易因 “格式不匹配”“類型錯誤” 導(dǎo)致失敗,以下是高頻問題的解決方案與優(yōu)化建議。

1. 常見錯誤及解決方法

錯誤現(xiàn)象 原因分析 解決方案
轉(zhuǎn)換失敗:“從字符串轉(zhuǎn)換日期和 / 或時間時,轉(zhuǎn)換失敗” 1. 字符串格式與style值不匹配(如用style=23轉(zhuǎn)換 '09/18/2024');2. 字符串包含無效日期(如 '20240230') 1. 確認字符串格式,選擇正確style(如 '09/18/2024' 用style=101);2. 用ISDATE()先判斷有效性:WHERE ISDATE(mixed_date) = 1
轉(zhuǎn)換后日期為NULL 字符串長度不足(如用varchar(8)轉(zhuǎn)換 '2024-09-18',長度僅 10) 確保目標字符串類型的長度足夠(如varchar(10)對應(yīng) “YYYY-MM-DD”)
時間部分丟失 目標類型為date(僅存日期),而非datetimedatetime2(存日期 + 時間) 需保留時間時,目標類型設(shè)為datetimedatetime2,如CONVERT(datetime, '2024-09-18 14:30', 120)

2. 優(yōu)化技巧

(1)優(yōu)先使用明確的style值,避免默認值

CONVERT的默認style值(0 或 100)會隨 SQL Server 的 “語言設(shè)置” 變化(如中文環(huán)境下默認格式為 “9 18 2024 2:30PM”),可能導(dǎo)致格式混亂。建議始終指定style值(如23“YYYY-MM-DD”、120“YYYY-MM-DD HH:mm:ss”),確保格式統(tǒng)一。

(2)避免對索引字段使用CONVERT,防止索引失效

若日期字段(如create_time)建立了索引,直接對其使用CONVERT會導(dǎo)致索引失效,觸發(fā)全表掃描:

-- 錯誤示例:對索引字段create_time使用CONVERT,索引失效

SELECT * FROM [order] WHERE CONVERT(varchar(10), create_time, 23) = '2024-09-18';

-- 優(yōu)化示例:將條件轉(zhuǎn)為日期類型,利用索引

SELECT * FROM [order] WHERE create_time BETWEEN '2024-09-18 00:00:00' AND '2024-09-18 23:59:59';

(3)處理大表時,先過濾再轉(zhuǎn)換

對百萬級以上的大表進行日期轉(zhuǎn)換時,先通過 “粗過濾”(如按年份、月份)減少數(shù)據(jù)量,再進行轉(zhuǎn)換,提升效率:

-- 優(yōu)化前:全表轉(zhuǎn)換,效率低

SELECT CONVERT(varchar(10), create_time, 23) AS create_date FROM [order];

-- 優(yōu)化后:先篩選2024年數(shù)據(jù),再轉(zhuǎn)換,效率提升

SELECT CONVERT(varchar(10), create_time, 23) AS create_date FROM [order] WHERE YEAR(create_time) = 2024;

(4)用datetime2替代datetime,提升精度與兼容性

datetime類型僅支持 “1753-01-01 至 9999-12-31”,且毫秒精度低;datetime2支持 “0001-01-01 至 9999-12-31”,且精度達 100 納秒。轉(zhuǎn)換時建議優(yōu)先使用datetime2

-- 轉(zhuǎn)換為datetime2類型,高精度

CONVERT(datetime2(3), '2024-09-18 14:30:45.123', 121);

五、總結(jié):CONVERT 日期轉(zhuǎn)換的核心原則

CONVERT函數(shù)在 SQL Server 日期處理中的核心價值,在于 “靈活的格式控制” 與 “可靠的類型轉(zhuǎn)換”,掌握其使用需牢記以下原則:

  1. 明確場景選style:根據(jù)報表格式、數(shù)據(jù)接口、查詢需求選擇對應(yīng)的style值(如跨系統(tǒng)用23,北美報表用101);

  2. 類型轉(zhuǎn)換要精準:字符串轉(zhuǎn)日期需匹配style,日期轉(zhuǎn)字符串需足夠長度,避免丟失信息或轉(zhuǎn)換失??;

  3. 性能優(yōu)先避誤區(qū):不對索引字段直接轉(zhuǎn)換,大表先過濾再轉(zhuǎn)換,確保查詢效率;

  4. 異常處理要完善:用ISDATE()判斷字符串有效性,用CASE處理多格式數(shù)據(jù),避免臟數(shù)據(jù)導(dǎo)致整體失敗。

無論是日常數(shù)據(jù)查詢、報表生成,還是復(fù)雜的數(shù)據(jù)清洗,CONVERT都是 SQL Server 中處理日期的 “瑞士軍刀”—— 熟練掌握其用法,能大幅提升日期數(shù)據(jù)的處理效率與準確性,為后續(xù)的數(shù)據(jù)分析與業(yè)務(wù)決策奠定基礎(chǔ)。

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

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

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

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } 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(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".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 = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+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); }