同一个SQL语句如何实现在ORACLE和SQLserver中查询某一天的数据

--问题:同一个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中执行
 

  

上一篇:22.01.17总结


下一篇:Esc和cpasLock对换