Index: forgon-tools/src/main/java/com/forgon/databaseadapter/service/DateQueryAdapter.java =================================================================== diff -u -r38766 -r41244 --- forgon-tools/src/main/java/com/forgon/databaseadapter/service/DateQueryAdapter.java (.../DateQueryAdapter.java) (revision 38766) +++ forgon-tools/src/main/java/com/forgon/databaseadapter/service/DateQueryAdapter.java (.../DateQueryAdapter.java) (revision 41244) @@ -509,6 +509,28 @@ } return ""; } + + /** + * 根据两个时间字段的时间差值获取差值大于或等于指定分钟的sql。兼容sqlserver、oracle、mysql。 + * 实现上使用开始时间字段加上指定分钟数并与结束时间字段进行比较。 + * @param startTimeField 开始时间字段。必须小于endTimeField + * @param endTimeField 结束时间字段。必须大于startTimeField + * @param minute 差值最少的分钟数 + * @return 返回两个时间字段的差值大于或等于指定分钟的sql条件语句 + */ + public String datetimeDiffGreaterOrEqual(String startTimeField, String endTimeField, int minute) { + if (StringUtils.isNotBlank(startTimeField) && StringUtils.isNotBlank(endTimeField)) { + // 使用开始时间字段加上指定分钟数,与结束时间字段进行比较 + if(dbConnection.isSqlServer()) { + return "DATEADD(MINUTE, "+minute+", "+startTimeField+") <= " + endTimeField; + } else if(dbConnection.isOracle()) { + return startTimeField + " + NUMTODSINTERVAL("+minute+", 'MINUTE') <= " + endTimeField; + }else if(dbConnection.isMySQLOrTiDB()) { + return "DATE_ADD("+startTimeField+", INTERVAL "+minute+" MINUTE) <= " + endTimeField; + } + } + return ""; + } /** * mysql数据库日期格式%转义,例如%Y-%m-%d转换为%%Y-%%m-%%d Index: forgon-tools/src/test/java/com/forgon/databaseadapter/service/DateQueryAdapterDatetimeDiffGreaterOrEqualTest.java =================================================================== diff -u --- forgon-tools/src/test/java/com/forgon/databaseadapter/service/DateQueryAdapterDatetimeDiffGreaterOrEqualTest.java (revision 0) +++ forgon-tools/src/test/java/com/forgon/databaseadapter/service/DateQueryAdapterDatetimeDiffGreaterOrEqualTest.java (revision 41244) @@ -0,0 +1,108 @@ +package com.forgon.databaseadapter.service; + +import com.forgon.tools.db.InitDbConnection; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + +/** + * DateQueryAdapter.datetimeDiffGreaterOrEqual 方法的单元测试 + */ +public class DateQueryAdapterDatetimeDiffGreaterOrEqualTest { + private DateQueryAdapter dateQueryAdapter; + private InitDbConnection mockDbConnection; + + @Before + public void setUp() { + // 初始化被测类和Mock对象 + dateQueryAdapter = new DateQueryAdapter(); + mockDbConnection = Mockito.mock(InitDbConnection.class); + dateQueryAdapter.setDbConnection(mockDbConnection); + } + + /** + * 测试SQL Server类型的SQL生成 + */ + @Test + public void testDatetimeDiffGreaterOrEqual_SqlServer() { + // 设置数据库类型为SQL Server + when(mockDbConnection.isSqlServer()).thenReturn(true); + when(mockDbConnection.isOracle()).thenReturn(false); + when(mockDbConnection.isMySQLOrTiDB()).thenReturn(false); + + String result = dateQueryAdapter.datetimeDiffGreaterOrEqual("start_time", "end_time", 30); + assertEquals("DATEADD(MINUTE, 30, start_time) <= end_time", result); + } + + /** + * 测试Oracle类型的SQL生成 + */ + @Test + public void testDatetimeDiffGreaterOrEqual_Oracle() { + // 设置数据库类型为Oracle + when(mockDbConnection.isSqlServer()).thenReturn(false); + when(mockDbConnection.isOracle()).thenReturn(true); + when(mockDbConnection.isMySQLOrTiDB()).thenReturn(false); + + String result = dateQueryAdapter.datetimeDiffGreaterOrEqual("start_time", "end_time", 45); + assertEquals("start_time + NUMTODSINTERVAL(45, 'MINUTE') <= end_time", result); + } + + /** + * 测试MySQL类型的SQL生成 + */ + @Test + public void testDatetimeDiffGreaterOrEqual_MySQL() { + // 设置数据库类型为MySQL + when(mockDbConnection.isSqlServer()).thenReturn(false); + when(mockDbConnection.isOracle()).thenReturn(false); + when(mockDbConnection.isMySQLOrTiDB()).thenReturn(true); + + String result = dateQueryAdapter.datetimeDiffGreaterOrEqual("start_time", "end_time", 60); + assertEquals("DATE_ADD(start_time, INTERVAL 60 MINUTE) <= end_time", result); + } + + /** + * 测试MySQL类型的SQL生成 + */ + @Test + public void testDatetimeDiffGreaterOrEqual_DBTypeError() { + // 设置数据库类型为MySQL + when(mockDbConnection.isSqlServer()).thenReturn(false); + when(mockDbConnection.isOracle()).thenReturn(false); + when(mockDbConnection.isMySQLOrTiDB()).thenReturn(false); + + String result = dateQueryAdapter.datetimeDiffGreaterOrEqual("start_time", "end_time", 60); + assertEquals("", result); + } + + /** + * 测试startTimeField为空的情况 + */ + @Test + public void testDatetimeDiffGreaterOrEqual_StartTimeFieldEmpty() { + String result = dateQueryAdapter.datetimeDiffGreaterOrEqual("", "end_time", 30); + assertEquals("", result); + } + + /** + * 测试endTimeField为空的情况 + */ + @Test + public void testDatetimeDiffGreaterOrEqual_EndTimeFieldEmpty() { + String result = dateQueryAdapter.datetimeDiffGreaterOrEqual("start_time", "", 30); + assertEquals("", result); + } + + /** + * 测试两个字段都为空的情况 + */ + @Test + public void testDatetimeDiffGreaterOrEqual_BothFieldsEmpty() { + String result = dateQueryAdapter.datetimeDiffGreaterOrEqual("", "", 30); + assertEquals("", result); + } +}