许多软件公司都理解开发不依赖于特定数据库类型(例如OracleSQL ServerDB)的应用程序的重要性它可以让客户们选择自己习惯的平台一般来说软件开发人员都能够识别出他们的负责数据库维护的客户和必须使用现有平台和个性化的客户
关于Oracle和SQL Server之间的区别已经有很多篇文章从企业的角度和数据库管理员的角度出发描写了两者之间的一般差别在这篇文章里面我将会从应用程序的角度向你描述SQL erver 和oracle平台之间的区别并且将会讨论开发不依赖于数据库环境的应用程序的几种可能的方法与此同时我不会再论讨对于应用程序来说两个平台之间显而易见的区别例如表的分割和索引
定义通用接口和语言有很少的几种通用语言和接口可以让应用程序不依赖于数据库想来也可以以同样的方式应用在关系型数据库上面: ANSI是美国国家标准局定义的这是一家志愿者成员的组织(用私人基金运转)他们在有关设备和程序等广泛领域内开发了国家承认的标准在数据库领域 ANSI定义了编写SQL命令的标准假设命令可以运行在任何的数据库上而不需要更改命令的语法
ODBC是开放数据库连接(ODBC)接口微软定义的它可以让应用程序访问数据库管理系统(DBMS)中的数据使用SQL作为访问数据的标准ODBC允许最大的互联性这意味着一个单个的应用程序可以访问不同的数据库管理系统然后应用程序终端用户可以添加开放数据库连接(ODBC)数据库驱动来将应用程序与他们所选择的数据库管理系统链接上 OLE DB是ODBC的继承者是一组允许例如基于VBC++Access等任何可以连接到类似SQL ServerOracleDBMySQL等后台的前台的软件组件在许多种情况下OLE DB组件都比原有的ODBC提供了好得多的性能
JDBC(Java数据库连接)应用程序接口是Java编程语言和广泛范围的数据库SQL数据库和其他表列数据源(例如电子表格或者普通文本文件)之间进行不依赖于数据库的连接的行业标准JDBD应用程序接口为基于SQL的数据库访问提供了调用级别的应用程序接口真实世界中的通用接口不幸的是并不是所有数据库级别的命令都是ANSI每个数据库平台都有自己的扩展功能对于ANSI或者通用接口一般来说都代表着几本功能因此也可能意味着丧失了性能方面的竞争力对于小型数据库和小型应用程序来说要维护对数据库的通用访问是简单的但是当数据库和/或应用程序变得越来越大越来越复杂你就不得不向代码中添加功能
SQL Server和Oracle的常用函数对比
数学函数
绝对值
S:select abs() value
O:select abs() value from dual
取整(大) S:select ceiling() value O:select ceil() value from dual
取整(小)
S:select floor() value O:select floor() value from dual
取整(截取)
S:select cast( as int) value O:select trunc() value from dual
四捨五入S:select round() value O:select round() value from dual
e为底的幂S:select Exp() value O:select Exp() value from dual
取e为底的对数S:select log() value O:select ln() value from dual;
取为底对数
S:select log() value
O:select log() value from dual;
取平方
S:select SQUARE() value
O:select power() value from dual
取平方根
S:select SQRT() value
O:select SQRT() value from dual
求任意数为底的幂S:select power() value O:select power() value from dual
取随机数
S:select rand() value
O:select sysdbms_randomvalue() value from dual;
取符号
S:select sign() value
O:select sign() value from dual
三角函数相关
圆周率S:SELECT PI() value
O:不知道
sincostan 参数都以弧度为单位
例如select sin(PI()/) value得到(SQLServer)
AsinAcosAtanAtan 返回弧度
弧度角度互换(SQLServerOracle不知道)
DEGREES弧度〉角度
RADIANS角度〉弧度
数值间比较
求集合最大值
S:select max(value) value from
(select value
union
select value
union
select value
union
select value)a
O:select greatest() value from dual
求集合最小值
S:select min(value) value from
(select value
union
select value
union
select value
union
select value)a
O:select least() value from dual
如何处理null值(F中的null以代替) S:select FIsNull(F) value from Tbl O:select Fnvl(F) value from Tbl
字符串函数
求字符序号
S:select ascii(a) value
O:select ascii(a) value from dual
从序号求字符
S:select char() value
O:select chr() value from dual
连接
S:select ++ value
O:select CONCAT()|| value from dual
子串位置 返回 S:select CHARINDEX(ssdsq) value O:select INSTR(sdsqs) value from dual
模糊子串的位置 返回参数去掉中间%则返回 // 本文转自 C++Builder 研究 ?i=&d=dwnrn S:select patindex(%d%q%sdsfasdqe) value O:oracle没发现但是instr可以通过第四个参数控制出现次数select INSTR(sdsfasdqesd) value from dual 返回
求子串S:select substring(abcd) value O:select substr(abcd) value from dual
子串代替 返回aijklmnef S:SELECT STUFF(abcdef ijklmn) value O:SELECT Replace(abcdef bcd ijklmn) value from dual
子串全部替换
S:Replace
O:select Translate(fasdbfasegasfa我 ) value from dual
长度S:lendatalength
O:length
大小写转换 lowerupper
单词首字母大写
S:没发现
O:select INITCAP(abcd dsaf df) value from dual
左补空格(LPAD的第一个参数为空格则同space函数)
S:select space()+abcd value
O:select LPAD(abcd) value from dual
右补空格(RPAD的第一个参数为空格则同space函数)
S:select abcd+space() value
O:select RPAD(abcd) value from dual
删除空格S:ltrimrtrim O:ltrimrtrimtrim
重复字符串S:select REPLICATE(abcd) value
O:没发现
发音相似性比较(这两个单词返回值一样发音相同) S:SELECT SOUNDEX (Smith) SOUNDEX (Smythe) O:SELECT SOUNDEX (Smith) SOUNDEX (Smythe) from dual SQLServer中用SELECT DIFFERENCE(Smithers Smythers) 比较soundex的差返回为同音最高
日期函数
系统时间
S:select getdate() value
O:select sysdate value from dual
前后几日
直接与整数相加减
求日期S:select convert(char()getdate()) value
O:select trunc(sysdate) value from dual
select to_char(sysdateyyyymmdd) value from dual
求时间S:select convert(char()getdate()) value O:select to_char(sysdatehh:mm:ss) value from dual
取日期时间的其他部分
S:DATEPART和DATENAME函数(第一个参数决定)
O:to_char函数第二个参数决定
参数下表需要补充
year yy yyyy quarter qq q (季度) month mm m (m O无效) dayofyear dy y (O表星期) day dd d (d O无效) week wk ww (wk O无效)
weekday dw (O不清楚)
Hour hhhhhh (hhhh S无效) minute mi n (n O无效) second ss s (s O无效)
millisecond ms (O无效)
当月最后一天
S:不知道
O:select LAST_DAY(sysdate) value from dual
本星期的某一天(比如星期日)
S:不知道
O:SELECT Next_day(sysdate) vaule FROM DUAL;
字符串转时间
S:可以直接转或者select cast(as datetime) value
O:SELECT To_date( ::yyyymmdd hhmiss) vaule FROM DUAL;
求两日期某一部分的差(比如秒)
S:select datediff(ssgetdate()getdate()+) value O:直接用两个日期相减(比如dd=)
SELECT (dd)*** vaule FROM DUAL;
根据差值求新的日期(比如分钟)
S:select dateadd(migetdate()) value
O:SELECT sysdate+// vaule FROM DUAL;
求不同时区时间
S:不知道
O:SELECT New_time(sysdateydtgmt ) vaule FROM DUAL;
时区参数北京在东区应该是Ydt
AST ADT大西洋标准时间
BST BDT白令海标准时间
CST CDT中部标准时间
EST EDT东部标准时间
GMT格林尼治标准时间
HST HDT阿拉斯加—夏威夷标准时间
MST MDT山区标准时间
NST纽芬兰标准时间
PST PDT太平洋标准时间
YST YDT YUKON标准时间
Oracle支持的字符函数和它们的Microsoft SQL Server等价函数:
函数Oracle Microsoft SQL Server
把字符转换为ASCII ASCII ASCII
字串连接CONCAT (expressiοn + expressiοn)
把ASCII转换为字符CHR CHAR
返回字符串中的开始字符(左起)INSTR CHARINDEX
把字符转换为小写LOWER LOWER
把字符转换为大写UPPER UPPER
填充字符串的左边LPAD N/A
清除开始的空白LTRIM LTRIM
清除尾部的空白RTRIM RTRIM
字符串中的起始模式(pattern)INSTR PATINDEX
多次重复字符串RPAD REPLICATE
字符串的语音表示SOUNDEX SOUNDEX
重复空格的字串RPAD SPACE
从数字数据转换为字符数据TO_CHAR STR
子串SUBSTR SUBSTRING
替换字符REPLACE STUFF
将字串中的每个词首字母大写INITCAP N/A
翻译字符串TRANSLATE N/A
字符串长度LENGTH DATELENGTH or LEN
列表中最大的字符串GREATEST N/A
列表中最小的字符串LEAST N/A
如果为NULL则转换字串 NVL ISNULL本文出自 CTOCOM技术博客