java開發(fā)之SQL語句中DATE_FORMAT函數(shù)舉例詳解
引言:
實際上在使用Java開發(fā)過程中,有很多業(yè)務場景下,都有時間類型的參數(shù)參與。前后端進行交互的時候,針對時間類型的格式都會做一個業(yè)務上的統(tǒng)一,方便開發(fā)且增加效率。關于后端的邏輯有兩個層面可以進行優(yōu)化,一個是底層sql方面,一個是業(yè)務層方面,這兩者之間的處理都可以影響整個業(yè)務方法的響應時間。本次分享在sql層面使用DATE_FORMAT 函數(shù) 對時間類型數(shù)據(jù)的處理
1、簡單介紹:
DATE_FORMAT 是 SQL 中的一個函數(shù),用于將日期或時間格式化為指定的格式,以下是sql形式的格式
DATE_FORMAT(date, format)
其中:
- date 是要格式化的日期或時間。
- format 是你希望得到的輸出格式。
2、舉例
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); 常見的格式化選項有: %Y 年份,四位數(shù) %y 年份,兩位數(shù) %m 月份,兩位數(shù) %d 日期,兩位數(shù) %H 小時,24小時制,兩位數(shù) %h 小時,12小時制,兩位數(shù) %i 分鐘,兩位數(shù) %s 秒,兩位數(shù) %p AM/PM
例子中,把時間轉化為 年月日格式,和電腦右下角的日期是相同的,那么針對Java中的傳參怎么應用呢,以下:
@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; }
代碼中僅有一個字段,該字段上貼有2個注解,插個題外話,大概解釋一下:
@DateTimeFormat :當前端丟給后端時間參數(shù)的時候,這個注解就將參數(shù)中的時間類型的樣式轉為我們設置的在該注解中的pattern一樣。
@JsonFormat:當后端丟給前端的結果是json模式時(一般都是json),該注解會把后端結果中的時間類型參數(shù)轉為我們在該注解中設置的pattern 一樣。注意:需要添加時區(qū)(timezone)
重點是無論怎么丟參數(shù),丟的都是Date類型,現(xiàn)在 使用sql 中 DATE_FORMAT 函數(shù)來參與業(yè)務
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>
也可以當作字段返回,如下:
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ù)據(jù)庫中某個時間單位是否在輸入的時間段之中
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ù),endTime 為傳入的結束時間參數(shù),這二者之間的時間段可以作為一個篩選條件,若該二者時間格式也需要調整,那么如下:
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ù)的簡單使用。
附:計算輸入的日期的差值
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+"天");
結果:我目前的時間距離2020年1月1日有223天。
注意:這里可能存在1天的誤差。
總結
到此這篇關于java開發(fā)之SQL語句中DATE_FORMAT函數(shù)舉例詳解的文章就介紹到這了,更多相關SQL DATE_FORMAT函數(shù)詳解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
skywalking分布式服務調用鏈路追蹤APM應用監(jiān)控
這篇文章主要為大家介紹了skywalking分布式服務調用鏈路追蹤APM應用監(jiān)控的功能使用說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03在SpringBoot中無縫整合Dubbo的實現(xiàn)過程
微服務架構已經(jīng)成為現(xiàn)代應用開發(fā)的熱門趨勢,而Dubbo作為一款強大的分布式服務框架,與Spring?Boot的結合是構建高性能微服務應用的理想選擇,本文將詳細介紹如何在SpringBoot中無縫整合Dubbo,需要的朋友可以參考下2024-01-01