--问题:同一个SQL语句如何实现在ORACLE和SQLserver中查询某一天的数据 --背景:项目需要共用SQL语句,通过配置文件中的数据库连接串和数据库类别,创建不同的数据库访问对象, -- 调用时的SQL入参字符串是共用的,因为SQLserver和ORECLE处理时间字段稍微有差异,导致sql带时间过滤时无法同时兼容两种数据库。 --例如: --SQLserver查询某天数据 SELECT A.* FROM mytest A WHERE a.TIMES>'2021-08-01 00:00:00' ----ORACEL查询某天数据 SELECT A.* FROM mytest A WHERE a.TIMES>TO_DATE('2021-08-01 00:00:00','YYYY-MM-DD HH24:MI:SS') --方案:同时在SQLserver和ORACEL创建一个同名的函数,将字符串转为日期格式 -- 因为SQLserver标量函数调用必须加dbo.且无法省略,处理方式为在ORACEL中 -- 创建一个名为dbo的包,将ORECLE的函数放入包中,最终达到一句SQL兼容两种数据库的目的。 --SQLserver创建函数将字符串转日期 CREATE FUNCTION [dbo].[F_ConvertStrToDate](@dateStr VARCHAR(100)) RETURNS DATETIME AS BEGIN DECLARE @temp DATETIME; SELECT @temp = CONVERT(DATETIME, @dateStr) RETURN @temp; END; --ORACLE创建一个包(dbo),将同名函数(F_ConvertStrToDate)放入包中 --创建包: CREATE PACKAGE DBO IS FUNCTION F_CONVERTSTRTODATE(H IN VARCHAR2) RETURN DATE; END; --创建包体 CREATE PACKAGE BODY DBO IS FUNCTION F_CONVERTSTRTODATE(H IN VARCHAR2) RETURN DATE AS BEGIN DBMS_OUTPUT.ENABLE(BUFFER_SIZE=>NULL); DBMS_OUTPUT.PUT_LINE(H); RETURN TO_DATE(H,'YYYY-MM-DD HH24:MI:SS'); END; END; --最终效果 SELECT A.* FROM mytest A WHERE a.TIMES>dbo.F_ConvertStrToDate('2021-08-01 00:00:00')--SQL同时可在ORACEL和SQLserver中执行