java開發(fā)之SQL語句中DATE_FORMAT函數(shù)舉例詳解
引言:
實(shí)際上在使用Java開發(fā)過程中,有很多業(yè)務(wù)場景下,都有時(shí)間類型的參數(shù)參與。前后端進(jìn)行交互的時(shí)候,針對(duì)時(shí)間類型的格式都會(huì)做一個(gè)業(yè)務(wù)上的統(tǒng)一,方便開發(fā)且增加效率。關(guān)于后端的邏輯有兩個(gè)層面可以進(jìn)行優(yōu)化,一個(gè)是底層sql方面,一個(gè)是業(yè)務(wù)層方面,這兩者之間的處理都可以影響整個(gè)業(yè)務(wù)方法的響應(yīng)時(shí)間。本次分享在sql層面使用DATE_FORMAT 函數(shù) 對(duì)時(shí)間類型數(shù)據(jù)的處理
1、簡單介紹:
DATE_FORMAT 是 SQL 中的一個(gè)函數(shù),用于將日期或時(shí)間格式化為指定的格式,以下是sql形式的格式
DATE_FORMAT(date, format)
其中:
- date 是要格式化的日期或時(shí)間。
- format 是你希望得到的輸出格式。
2、舉例
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); 常見的格式化選項(xiàng)有: %Y 年份,四位數(shù) %y 年份,兩位數(shù) %m 月份,兩位數(shù) %d 日期,兩位數(shù) %H 小時(shí),24小時(shí)制,兩位數(shù) %h 小時(shí),12小時(shí)制,兩位數(shù) %i 分鐘,兩位數(shù) %s 秒,兩位數(shù) %p AM/PM
例子中,把時(shí)間轉(zhuǎn)化為 年月日格式,和電腦右下角的日期是相同的,那么針對(duì)Java中的傳參怎么應(yīng)用呢,以下:
@Data
public class AITimeDatePlay {
@DateTimeFormat(
pattern = "yyyy-MM-dd HH:mm:ss"
)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date testTime;
}
代碼中僅有一個(gè)字段,該字段上貼有2個(gè)注解,插個(gè)題外話,大概解釋一下:
@DateTimeFormat :當(dāng)前端丟給后端時(shí)間參數(shù)的時(shí)候,這個(gè)注解就將參數(shù)中的時(shí)間類型的樣式轉(zhuǎn)為我們設(shè)置的在該注解中的pattern一樣。
@JsonFormat:當(dāng)后端丟給前端的結(jié)果是json模式時(shí)(一般都是json),該注解會(huì)把后端結(jié)果中的時(shí)間類型參數(shù)轉(zhuǎn)為我們在該注解中設(shè)置的pattern 一樣。注意:需要添加時(shí)區(qū)(timezone)
重點(diǎn)是無論怎么丟參數(shù),丟的都是Date類型,現(xiàn)在 使用sql 中 DATE_FORMAT 函數(shù)來參與業(yè)務(wù)
List<EmployeeInfo> queryInfomationByTime(AITimeDatePlay dto);
最終查詢sql
<select id="queryInfomationByTime" resultType="com.bonade.hrm.foundation.model.EmployeeInfo">
select *
from employee_info ei
where date_format(ei.initiation_time,'%Y-%m-%d') = DATE_FORMAT(#{testTime},'%Y-%m-%d')
</select>
也可以當(dāng)作字段返回,如下:
select date_format(ei.initiation_time,'%Y-%m-%d') as bigTime
from employee_info ei
where date_format(ei.initiation_time,'%Y-%m-%d') = DATE_FORMAT(#{testTime},'%Y-%m-%d')
也可以按照需求,只精確到年月
select date_format(ei.initiation_time,'%Y-%m') as bigTime
from employee_info ei
where date_format(ei.initiation_time,'%Y-%m') = DATE_FORMAT(#{testTime},'%Y-%m')
也可以輸入首、尾時(shí)間,取數(shù)據(jù)庫中某個(gè)時(shí)間單位是否在輸入的時(shí)間段之中
select date_format(ei.initiation_time,'%Y-%m') as bigTime
from employee_info ei
where (
((DATE_FORMAT( ei.initiation_time, '%Y-%m' )) BETWEEN #{startTime} AND #{endTime})
OR (( DATE_FORMAT( ei.leave_time, '%Y-%m' )) BETWEEN #{startTime} AND #{endTime})
)
startTime 為傳入的開始時(shí)間參數(shù),endTime 為傳入的結(jié)束時(shí)間參數(shù),這二者之間的時(shí)間段可以作為一個(gè)篩選條件,若該二者時(shí)間格式也需要調(diào)整,那么如下:
select date_format(ei.initiation_time,'%Y-%m') as bigTime
from employee_info ei
where (
((DATE_FORMAT( ei.initiation_time, '%Y-%m' )) BETWEEN DATE_FORMAT(#{startTime},'%Y-%m') AND DATE_FORMAT(#{endTime},'%Y-%m'))
OR (( DATE_FORMAT( ei.leave_time, '%Y-%m' )) BETWEEN DATE_FORMAT(#{startTime},'%Y-%m') AND DATE_FORMAT(#{endTime},'%Y-%m'))
)
以上則是分享的DATE_FORMAT函數(shù)的簡單使用。
附:計(jì)算輸入的日期的差值
SimpleDateFormat date = new SimpleDateFormat("yyyy年MM月dd日");
? ? ? ? Date date1 = new Date();
? ? ? ? Date date2 = date.parse("2020年1月1日");
? ? ? ? System.out.println((date1.getTime()-date2.getTime())/1000/3600/24+"天");結(jié)果:我目前的時(shí)間距離2020年1月1日有223天。

注意:這里可能存在1天的誤差。
總結(jié)
到此這篇關(guān)于java開發(fā)之SQL語句中DATE_FORMAT函數(shù)舉例詳解的文章就介紹到這了,更多相關(guān)SQL DATE_FORMAT函數(shù)詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
eclipse啟動(dòng)tomcat無法訪問的解決方法
這篇文章介紹了eclipse啟動(dòng)tomcat無法訪問的解決方法,有需要的朋友可以參考一下2013-10-10
java返回的List進(jìn)行add操作報(bào)錯(cuò)
本文主要介紹了java返回的List進(jìn)行add操作報(bào)錯(cuò),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
skywalking分布式服務(wù)調(diào)用鏈路追蹤APM應(yīng)用監(jiān)控
這篇文章主要為大家介紹了skywalking分布式服務(wù)調(diào)用鏈路追蹤APM應(yīng)用監(jiān)控的功能使用說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03
在SpringBoot中無縫整合Dubbo的實(shí)現(xiàn)過程
微服務(wù)架構(gòu)已經(jīng)成為現(xiàn)代應(yīng)用開發(fā)的熱門趨勢,而Dubbo作為一款強(qiáng)大的分布式服務(wù)框架,與Spring?Boot的結(jié)合是構(gòu)建高性能微服務(wù)應(yīng)用的理想選擇,本文將詳細(xì)介紹如何在SpringBoot中無縫整合Dubbo,需要的朋友可以參考下2024-01-01
Spring中的AOP動(dòng)態(tài)代理源碼詳解
這篇文章主要介紹了Spring中的AOP動(dòng)態(tài)代理源碼詳解,AOP即面向切面編程也稱面向方面編程,它是面向?qū)ο缶幊蘋OP的一種補(bǔ)充,目前已成為一種比較成熟的編程方式,本文就其源碼進(jìn)行解析,需要的朋友可以參考下2023-09-09

