SQL中日期格式處理方法大全
背景:
實際工作,使用SQL語句對數(shù)據(jù)進行處理,有一大部分工作是對日期時間型數(shù)據(jù)進行處理,通過對字段的拼接或轉(zhuǎn)換生成實際需要的格式的日期字段。本文章盡可能全面記錄現(xiàn)在主流的數(shù)據(jù)庫(MySQL和Hive)對日期格式的處理,形成一份工作速查文檔,提升工作效率。
一、獲取當(dāng)前日期
MySQL
select now(); --日期時間格式 select current_date(); -- 日期格式 select current_time(); -- 時間格式 select sysdate(); -- 日期時間格式 select current_timestamp(); -- 日期時間戳
Hive
select current_date() -- 日期格式 select current_timestamp() -- 日期時間格式
sql server
select getdate() --獲得年月日 select convert(nvarchar(10),getdate(),120) --獲得年月 select convert(nvarchar(7),getdate(),120)
二、日期格式化
格式化可以將不符合要求規(guī)范的日期格式字段或字符串類型字段轉(zhuǎn)換為格式化日期。
MySQL
select date_format('20230613','%Y-%m-%d');
select date_format('20230613','%Y-%m-%d %H:%i:%s');
select date_format(now(),'%Y-%m-%d');
-- 可使用unix_timestamp函數(shù)獲取 unix 時間戳,使用時間格式轉(zhuǎn)換函數(shù)from_unixtime轉(zhuǎn)換為格式日期
select from_unixtime(unix_timestamp('20230613'), '%Y-%m-%d');Hive
select date_format(current_timestamp(),'yyyy-MM-dd')
-- Hive中對月份格式用MM
select date_format(current_timestamp(),'yyyy-MM-dd HH:mm:ss')
select from_unixtime(unix_timestamp('2023-06-13', 'yyyy-MM-dd'), 'yyyyMMdd') -- 生成20230613對應(yīng)格式的日期
-- unix_timestamp返回對應(yīng)時間戳
select unix_timestamp() -- 返回當(dāng)前時間對應(yīng)的時間戳,時間戳數(shù)值可以加減,如一小時3600秒,一天86400秒sql server
select convert(datetime,'YYYY-MM-DD HH24:MI:SS')
-- cast強制轉(zhuǎn)換
select cast('YYYY-MM-DD HH24:MI:SS' as datetime)三、日期轉(zhuǎn)換為字符串
SQL表中存儲日期對數(shù)據(jù)類型有要求,特別是 hive存儲日期時間的時候通常用string,所以有時也要實現(xiàn)日期轉(zhuǎn)換為字符串。
MySQL
-- 可使用substr字符串切割函數(shù),返回從m開始長度為n的字符串 select substr(now(),1,10); -- 使用concat字符串拼接函數(shù) select concat(substr(now(),1,4),substr(now(),6,2));
Hive
-- 使用cast強制轉(zhuǎn)換為字符串
select cast(from_unixtime(unix_timestamp('20230613', 'yyyyMMdd'), 'yyyy-MM-dd') as string)sql server
-- select convert(nvarchar(10),getdate(),120) -- 常用格式 Select CONVERT(varchar(100), GETDATE(), 120) -- 年月日 時分秒 Select CONVERT(varchar(100), GETDATE(), 112) -- 年月日(無分隔符) Select CONVERT(varchar(100), GETDATE(), 111) -- 年月日(分隔符/) Select CONVERT(varchar(100), GETDATE(), 102) -- 年月日(分隔符.) Select CONVERT(varchar(100), GETDATE(), 23) -- 年月日(分隔符-) Select CONVERT(varchar(100), GETDATE(), 8) -- 時分秒
日期計算
在表的實際計算中,常需要計算距離某個日期或現(xiàn)在日期往前或往后某段時間的日期。
-- 加(Mysql)
select date_add(now(),interval 1 day);
-- year:年,quarter:季,month:月,week:周,day:天,hour:小時,minuter:分鐘,second:秒,microsecond:毫秒
-- 加(sql server)
select dateadd(day,n,'2023-06-20')
-- 加(Hive)
select date_add(current_timestamp(),1) -- 加一天
select date_format(date_sub(current_timestamp(),1),'yyyy-MM-dd') --指定前一天日期
select from_unixtime((unix_timestamp()-86400),'yyyy-MM') --指定前一天日期
-- 減
select date_sub(now(),interval 1 month);
select date_sub(date_format(current_timestamp(),'yyyy-MM-dd'),1)
select date_sub(current_timestamp(),14) -- Hive指定前一天日期
-- 計算日期間隔
select datediff('2023-6-16','2023-6-1') -- mysql計算兩個日期之間的間隔(相差天數(shù))
select datediff('d','2023-6-1','2023-6-16 12:20:00') --sql server計算兩個日期之間間隔天數(shù)
select timediff('12:00:00', '11:30:00') -- 兩個時間間隔
select timestampdiff(month,date_sub(now(),interval 60 day),now()); -- 相差月
-- timestampdiff第一個參數(shù)定義返回計算的結(jié)果。year:年,quarter:季,month:月,week:周,day:天,hour:小時,minuter:分鐘,second:秒,microsecond:毫秒
-- timestampdiff減去的日期帶有時間,會認(rèn)為是下一天(2023-07-20 08:00:00會按照2023-07-21計算);datediff會直接截取時間(2023-07-20 18:00:00也會按照2023-07-20計算)
select timestampdiff(day,'2023-07-13',current_date()) -- timestampdiff可以實現(xiàn)各種字符串(例如2023-07-13,20230703)日期的加減
-- 當(dāng)月的第一天
select STR_TO_DATE(CONCAT(DATE_FORMAT(now(),'%Y-%m'), '-01'), '%Y-%m-%d')
-- sql server返回當(dāng)月1號
select CONVERT(varchar(10),DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0),120)
-- 當(dāng)月最后一天
select DATE_ADD(STR_TO_DATE(CONCAT(DATE_FORMAT(DATE_ADD(now(),INTERVAL 1 MONTH),'%Y-%m'), '-01'), '%Y-%m-%d'),INTERVAL -1 DAY); 總結(jié)
到此這篇關(guān)于SQL中日期格式處理的文章就介紹到這了,更多相關(guān)SQL日期格式處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Navicat?for?MySQL導(dǎo)入csv文件時出現(xiàn)中文亂碼的問題解決
在做數(shù)據(jù)對接導(dǎo)入的時候使用的數(shù)據(jù)是CSV格式的文件,導(dǎo)入發(fā)現(xiàn)了亂碼,下面這篇文章主要給大家介紹了關(guān)于Navicat?for?MySQL導(dǎo)入csv文件時出現(xiàn)中文亂碼的問題解決辦法,需要的朋友可以參考下2023-12-12
在SQL Server和Oracle中創(chuàng)建job
有的時候,我們可能需要在數(shù)據(jù)庫中設(shè)定一些自動執(zhí)行的任務(wù)(job),以此來自動完成一些包括統(tǒng)計、備份方面的需求,下面就簡單說明一下有關(guān)ms server和oracle兩種數(shù)據(jù)庫中如何新建自動任務(wù)。2009-06-06
數(shù)據(jù)庫觸發(fā)器(Trigger)的一點使用心得
最近了解了一下數(shù)據(jù)庫觸發(fā)器,并做一點實際的應(yīng)用,在翻看其概念的時候,還是本著從理解的角度來學(xué)習(xí)的,但是,到了實際的應(yīng)用場景中,還是有一些特別注意的地方的,下面是自己在應(yīng)用中的幾點體會2009-07-07
深入解析NoSQL數(shù)據(jù)庫的分布式算法(圖文詳解)
這篇文章主要介紹了深入解析NoSQL數(shù)據(jù)庫的分布式算法,需要的朋友可以參考下2015-12-12

