存档
Sybase IQ和ASE中都有函数ascii,返回字符串表达式中第一个字节的整数 ASCII 值!
那么, 如何获得字符串的十六进制形式呢?
比如:以GBK编码的三个汉字“数据库”的十六进制形式为:0xcafdbeddbfe2
可以验证一下: select char(hextoint('ca')) + char(hextoint('fd')) , char(hextoint('be')) + char(hextoint('dd')),char(hextoint('bf')) + char(hextoint('e2'))
本文提供两种方法,主要涉及到的函数有: substring,ascii,inttohex,right,list,string以及sa_rowgenerator系统过程。
Oracle中查询月底那天的日期的函数为:last_day()。 在ASE中没有对应的函数,在Oracle移植到Sybase的时候,需要手动编写函数来实现,幸亏ASE15.0.2后开始支持自定义函数。
下面提供3种实现查询本月最后一天的日期的SQL语句:
第一种:
select dateadd(dd,-1,convert(char(8),(datepart(yy,dateadd(mm,1,getdate()))*10000+datepart(mm,dateadd(mm,1,getdate()))*100+01)))
go
将本月的下一个月的年份和月份提取出来,以数字的形式相加,然后转化成类似YYYYMMDD的这种日期格式。最后直接取下个月的第一天的前一天即可。在ASE中字符串 '20110101' 和 convert(datetime,'20110101') 是相等的。
第二种:
Sybase ASE在15.0.2后支持用户自定义函数,但是只能返回标量值,且调用的时候必须在函数名前加创建者的用户名,这一点很不友好哦。数据库的dbowner默认就有创建函数的权限。普通的用户默认不具有创建函数的权限。
用户escourt4创建自定义函数的时候报下面的错误:
Msg 10331, Level 14, State 1:
Server 'TEST', Procedure 'datefmt_lzf', Line 4:
CREATE FUNCTION permission denied, database ultranms2, owner dbo
但是Sybase自动的客户端工具Sybase Central中却没有能够授予创建函数权限的地方。
只能授予创建缺省值(create default),创建过程(create procedure),创建规则(create rule),创建表(create table),创建视图(create view),创建加密密钥的权限。
Sybase ASE自15.0.2后增加了用户自定义函数的功能。
在Sybase中,以 2010-10-18 12:30:01格式显示日期数据时,用convert函数不能实现,需要替换一下字符。
select convert(varchar,getdate(),117)
go
------------------------------
2010/10/18 20:51:10
(1 row affected)
利用函数str_replace替换上面返回的日期字符串中的/为-
str_replace(convert(char(19),getdate(),117),'/','-')
1> select str_replace(convert(char(19),getdate(),117),'/','-')
2> go-------------------
2010-10-18 20:53:13(1 row affected)