ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2022-01-18 11:05:16  阅读:210  来源: 互联网

标签:00 dbo -- 创建 SQLserver SQL ORACLE


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

  

标签:00,dbo,--,创建,SQLserver,SQL,ORACLE
来源: https://www.cnblogs.com/soulsjie/p/15816815.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有