随笔-314  评论-209  文章-0  trackbacks-0
 
将hbase shell的timestamp转为可读。下面的示例将-ROOT-表的列info:serverstartcode的timestamp和value转成可读格式。
hbase(main):001:0> scan '-ROOT-'
ROW                        COLUMN+CELL
 .META.,,1                 column=info:regioninfo, timestamp=1340249081981, value={NAME => '.META.,,
                           1', STARTKEY => '', ENDKEY => '', ENCODED => 1028785192,}
 .META.,,1                 column=info:server, timestamp=1341304672637, value=Hadoop46:60020
 .META.,,1                 column=info:serverstartcode, timestamp=1341304672637, value=1341301228326
 .META.,,1                 column=info:v, timestamp=1340249081981, value=\x00\x00
1 row(s) in 1.3230 seconds

hbase(main):002:0> import java.util.Date
=> Java::JavaUtil::Date
hbase(main):003:0> Date.new(1341304672637).toString()
=> "Tue Jul 03 16:37:52 CST 2012"
hbase(main):004:0> Date.new(1341301228326).toString()
=> "Tue Jul 03 15:40:28 CST 2012"

在shell中,如果有可读日期,能否转成long类型呢?

hbase(main):005:0> import java.text.SimpleDateFormat
=> Java::JavaText::SimpleDateFormat
hbase(main):006:0> import java.text.ParsePosition
=> Java::JavaText::ParsePosition

hbase(main):015:0> SimpleDateFormat.new("yy/MM/dd").parse("12/07/03",ParsePosition.new(0)).getTime()
=> 1341244800000

参考

http://abloz.com/hbase/book.html

posted @ 2014-12-01 09:39 xzc 阅读(5103) | 评论 (1)编辑 收藏
     摘要: from:http://abloz.comauthor:ablozhoudate:2012.7.3在hbase的官方文档里,讲述了hbase的bin目录下的ruby程序,可以采用如下的方式执行:如果要使用脚本,可以看Hbase的bin 目录.在里面找到后缀为 *.rb的脚本.要想运行这个脚本,要这样 $ ./bin/hbase org.jruby.Main PATH_TO_SCRIPT 如...  阅读全文
posted @ 2014-09-27 12:53 xzc 阅读(2151) | 评论 (0)编辑 收藏
转自:http://www.cnblogs.com/linjiqin/archive/2013/03/08/2949339.html

Hbase shell详情

HBase 为用户提供了一个非常方便的使用方式, 我们称之为“HBase Shell”。
HBase Shell 提供了大多数的 HBase 命令, 通过 HBase Shell 用户可以方便地创建、删除及修改表, 还可以向表中添加数据、列出表中的相关信息等。
备注:写错 HBase Shell 命令时用键盘上的“Delete”进行删除,“Backspace”不起作用。
在启动 HBase 之后,用户可以通过下面的命令进入 HBase Shell 之中,命令如下所示:

hadoop@ubuntu:~$ hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.94.3, r1408904, Wed Nov 14 19:55:11 UTC 2012

hbase(main):001:0> 

具体的 HBase Shell 命令如下表 1.1-1 所示:

下面我们将以“一个学生成绩表”的例子来详细介绍常用的 HBase 命令及其使用方法。


这里 grad 对于表来说是一个列,course 对于表来说是一个列族,这个列族由三个列组成 china、math 和 english,当然我们可以根据我们的需要在 course 中建立更多的列族,如computer,physics 等相应的列添加入 course 列族。(备注:列族下面的列也是可以没有名字的。)
1). create 命令
创建一个具有两个列族“grad”和“course”的表“scores”。其中表名、行和列都要用单引号括起来,并以逗号隔开。
hbase(main):012:0> create 'scores', 'name', 'grad', 'course'

2). list 命令
查看当前 HBase 中具有哪些表。
hbase(main):012:0> list

3). describe 命令
查看表“scores”的构造。
hbase(main):012:0> describe 'scores'

4). put 命令
使用 put 命令向表中插入数据,参数分别为表名、行名、列名和值,其中列名前需要列族最为前缀,时间戳由系统自动生成。
格式: put 表名,行名,列名([列族:列名]),值
例子:
a. 加入一行数据,行名称为“xiapi”,列族“grad”的列名为”(空字符串)”,值位 1。
hbase(main):012:0> put 'scores', 'xiapi', 'grad:', '1'
hbase(main):012:0> put 'scores', 'xiapi', 'grad:', '2' --修改操作(update)
b. 给“xiapi”这一行的数据的列族“course”添加一列“<china,97>”。
hbase(main):012:0> put 'scores', 'xiapi',  'course:china', '97'
hbase(main):012:0> put 'scores', 'xiapi',  'course:math', '128'
hbase(main):012:0> put 'scores', 'xiapi',  'course:english', '85'

5). get 命令
a.查看表“scores”中的行“xiapi”的相关数据。
hbase(main):012:0> get 'scores', 'xiapi'
b.查看表“scores”中行“xiapi”列“course :math”的值。
hbase(main):012:0> get 'scores', 'xiapi', 'course :math'
或者
hbase(main):012:0> get 'scores', 'xiapi', {COLUMN=>'course:math'}
hbase(main):012:0> get 'scores', 'xiapi', {COLUMNS=>'course:math'}
备注:COLUMN 和 COLUMNS 是不同的,scan 操作中的 COLUMNS 指定的是表的列族, get操作中的 COLUMN 指定的是特定的列,COLUMNS 的值实质上为“列族:列修饰符”。COLUMN 和 COLUMNS 必须为大写。

6). scan 命令
a. 查看表“scores”中的所有数据。
hbase(main):012:0> scan 'scores'
注意:
scan 命令可以指定 startrow,stoprow 来 scan 多个 row。
例如:
scan 'user_test',{COLUMNS =>'info:username',LIMIT =>10, STARTROW => 'test', STOPROW=>'test2'}
b.查看表“scores”中列族“course”的所有数据。
hbase(main):012:0> scan  'scores', {COLUMN => 'grad'}
hbase(main):012:0> scan  'scores', {COLUMN=>'course:math'}
hbase(main):012:0> scan  'scores', {COLUMNS => 'course'}
hbase(main):012:0> scan  'scores', {COLUMNS => 'course'}

7). count 命令
hbase(main):068:0> count 'scores'

8). exists 命令
hbase(main):071:0> exists 'scores'

9). incr 命令(赋值)

10). delete 命令
删除表“scores”中行为“xiaoxue”, 列族“course”中的“math”。
hbase(main):012:0>  delete 'scores', 'xiapi', 'course:math'

11). truncate 命令
hbase(main):012:0>  truncate 'scores'

12). disbale、drop 命令
通过“disable”和“drop”命令删除“scores”表。
hbase(main):012:0>  disable 'scores' --enable 'scores' 
hbase(main):012:0>  drop 'scores'

13).  status命令
hbase(main):072:0> status

14).  version命令
hbase(main):073:0> version

另外,在 shell 中,常量不需要用引号引起来,但二进制的值需要双引号引起来,而其他值则用单引号引起来。HBase Shell 的常量可以通过在 shell 中输入“Object.constants”。

posted @ 2014-09-27 11:53 xzc 阅读(972) | 评论 (0)编辑 收藏

最近在hadoop实际使用中有以下几个小细节分享: i=m5M]Ef  
1 中文问题 
    从url中解析出中文,但hadoop中打印出来仍是乱码?我们曾经以为hadoop是不支持中文的,后来经过查看源代码,发现hadoop仅仅是不支持以gbk格式输出中文而己。

    这是TextOutputFormat.class中的代码,hadoop默认的输出都是继承自FileOutputFormat来的,FileOutputFormat的两个子类一个是基于二进制流的输出,一个就是基于文本的输出TextOutputFormat。

    public class TextOutputFormat<K, V> extends FileOutputFormat<K, V> { 
  protected static class LineRecordWriter<K, V> &E{CQ#k  
    implements RecordWriter<K, V> { 
    private static final String utf8 = “UTF-8″;//这里被写死成了utf-8 2 kP0//  
    private static final byte[] newline; kTC'`xv  
    static { :htz]  
      try { 0 _!')+  
        newline = “/n”.getBytes(utf8); Ry$zF~[   
      } catch (UnsupportedEncodingException uee) { 
        throw new IllegalArgumentException(”can’t find ” + utf8 + ” encoding”); 
      } 
    } 
k-:wM`C  
    public LineRecordWriter(DataOutputStream out, String keyValueSeparator) { 
      this.out = out; 
      try { 
        this.keyValueSeparator = keyValueSeparator.getBytes(utf8); 
      } catch (UnsupportedEncodingException uee) { @r.w+E=  
        throw new IllegalArgumentException(”can’t find ” + utf8 + ” encoding”); 
      } 
    } ab}Kt($  
… 
    private void writeObject(Object o) throws IOException { 
      if (o instanceof Text) { 
        Text to = (Text) o; 
        out.write(to.getBytes(), 0, to.getLength());//这里也需要修改 q&DM*!Jq  
      } else { 5 O't-'  
        out.write(o.toString().getBytes(utf8)); 
      } 
    } 
 … qxQuXF>:#  
} |3bCq(ZR/P  
    可以看出hadoop默认的输出写死为utf-8,因此如果decode中文正确,那么将Linux客户端的character设为utf-8是可以看到中文的。因为hadoop用utf-8的格式输出了中文。 
    因为大多数数据库是用gbk来定义字段的,如果想让hadoop用gbk格式输出中文以兼容数据库怎么办? _.{I1*6Y2  
    我们可以定义一个新的类: .c5)`  
    public class GbkOutputFormat<K, V> extends FileOutputFormat<K, V> { sTS Nu+  
  protected static class LineRecordWriter<K, V> 
    implements RecordWriter<K, V> { 
//写成gbk即可 F"ua`ercI  
    private static final String gbk = “gbk”;
 
    private static final byte[] newline; 
    static { 
      try { 
        newline = “/n”.getBytes(gbk); 
      } catch (UnsupportedEncodingException uee) { @}<b42  
        throw new IllegalArgumentException(”can’t find ” + gbk + ” encoding”); 
      } 
    } 
SjL&/),  
    public LineRecordWriter(DataOutputStream out, String keyValueSeparator) { P?o|N<46  
      this.out = out; X-<l+WP  
      try { 0,]m.)ws  
        this.keyValueSeparator = keyValueSeparator.getBytes(gbk); Js'j}w  
      } catch (UnsupportedEncodingException uee) { 
        throw new IllegalArgumentException(”can’t find ” + gbk + ” encoding”); 
      } 
    } J|aU}Z8m  
/(&UDG$  
    private void writeObject(Object o) throws IOException { 
      if (o instanceof Text) { 
//        Text to = (Text) o; 
//        out.write(to.getBytes(), 0, to.getLength()); +A-z>T(  
//      } else {
@h,3"2W{Ev  
        out.write(o.toString().getBytes(gbk)); 
      } 
    } isU4D  
 … eL_Il.:  

    然后在mapreduce代码中加入conf1.setOutputFormat(GbkOutputFormat.class) 
    即可以gbk格式输出中文。

2 关于计算过程中的压缩和效率的对比问题 hf//2Vl  
    之前曾经介绍过对输入文件采用压缩可以提高部分计算效率。现在作更进一步的说明。 
    为什么压缩会提高计算速度?这是因为mapreduce计算会将数据文件分散拷贝到所有datanode上,压缩可以减少数据浪费在带宽上的时间,当这些时间大于压缩/解压缩本身的时间时,计算速度就会提高了。 
    hadoop的压缩除了将输入文件进行压缩外,hadoop本身还可以在计算过程中将map输出以及将reduce输出进行压缩。这种计算当中的压缩又有什么样的效果呢? 
    测试环境:35台节点的hadoop cluster,单机2 CPU,8 core,8G内存,redhat 2.6.9, 其中namenode和second namenode各一台,namenode和second namenode不作datanode 
    输入文件大小为2.5G不压缩,records约为3600万条。mapreduce程序分为两个job: ;R]~9Aan  
    job1:map将record按user字段作key拆分,reduce中作外连接。这样最后reduce输出为87亿records,大小540G 
    job2:map读入这87亿条数据并输出,reduce进行简单统计,最后的records为2.5亿条,大小16G 
    计算耗时54min

    仅对第二个阶段的map作压缩(第一个阶段的map输出并不大,没有压缩的必要),测试结果:计算耗时39min

    可见时间上节约了15min,注意以下参数的不同。 U&W/Nj  
    不压缩时: 
     Local bytes read=1923047905109 :3[;9xCHj  
     Local bytes written=1685607947227 "j8`)XXa(  
     压缩时: /U>|^$4 #5  
     Local bytes read=770579526349 |RL/2j|  
     Local bytes written=245469534966 
     本地读写的的数量大大降低了

     至于对reduce输出的压缩,很遗憾经过测试基本没有提高速度的效果。可能是因为第一个job的输出大多数是在本地机上进行map,不经过网络传输的原因。 
     附:对map输出进行压缩,只需要添加 jobConf.setMapOutputCompressorClass(DefaultCodec.class)

3 关于reduce的数量设置问题 
    reduce数量究竟多少是适合的。目前测试认为reduce数量约等于cluster中datanode的总cores的一半比较合适,比如 cluster中有32台datanode,每台8 core,那么reduce设置为128速度最快。因为每台机器8 core,4个作map,4个作reduce计算,正好合适。 u/(>a  
    附小测试:对同一个程序 j&[u$P*K  
            reduce num=32,reduce time = 6 min 
            reduce num=128, reduce time = 2 min 
            reduce num=320, reduce time = 5min

 

4某次正常运行mapreduce实例时,抛出错误

java.io.IOException: All datanodes xxx.xxx.xxx.xxx:xxx are bad. Aborting…

at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.processDatanodeError(DFSClient.java:2158)

at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.access$1400(DFSClient.java:1735)

at org.apache.hadoop.dfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:1889)

java.io.IOException: Could not get block locations. Aborting…

at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.processDatanodeError(DFSClient.java:2143)

at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.access$1400(DFSClient.java:1735)

at org.apache.hadoop.dfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:1889)

经查明,问题原因是linux机器打开了过多的文件导致。用命令ulimit -n可以发现linux默认的文件打开数目为1024,修改/ect/security/limit.conf,增加hadoop soft 65535

再重新运行程序(最好所有的datanode都修改),问题解决

P.S:据说hadoop dfs不能管理总数超过100M个文件,有待查证

5 运行一段时间后hadoop不能stop-all.sh的问题,显示报错

no tasktracker to stop ,no datanode to stop

问题的原因是hadoop在stop的时候依据的是datanode上的mapred和dfs进程号。而默认的进程号保存在/tmp下,linux 默认会每隔一段时间(一般是一个月或者7天左右)去删除这个目录下的文件。因此删掉hadoop-hadoop-jobtracker.pid和 hadoop-hadoop-namenode.pid两个文件后,namenode自然就找不到datanode上的这两个进程了。

在配置文件中的export HADOOP_PID_DIR可以解决这个问题

这里还有个文章, 提及了几个hadoop/mapred的优化细节

http://thethethethethethe.spaces.live.com/blog/cns!A001241972EA08EA!228.entry

posted @ 2013-10-17 17:14 xzc 阅读(4713) | 评论 (0)编辑 收藏

分类:

 

linux中用shell获取昨天、明天或多天前的日期:
在Linux中对man date -d 参数说的比较模糊,以下举例进一步说明:
# -d, --date=STRING display time described by STRING, not `now’
[root@Gman root]# date -d next-day +%Y%m%d #明天日期
20091024
[root@Gman root]# date -d last-day +%Y%m%d #昨天日期
20091022
[root@Gman root]# date -d yesterday +%Y%m%d #昨天日期
20091022
[root@Gman root]# date -d tomorrow +%Y%m%d # 明天日期
20091024
[root@Gman root]# date -d last-month +%Y%m #上个月日期
200909
[root@Gman root]# date -d next-month +%Y%m #下个月日期
200911
[root@Gman root]# date -d next-year +%Y #明年日期
2010
DATE=$(date +%Y%m%d --date ’2 days ago’) #获取昨天或多天前的日期
名称 : date
使用权限 : 所有使用者
使用方式 : date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=datestr] [--help] [--version] [+FORMAT] [MMDDhhmm[[CC]YY][.ss]]
说明 : date 能用来显示或设定系统的日期和时间,在显示方面,使用者能设定欲显示的格式,格式设定为一个加号后接数个标记,其中可用的标记列表如下 :
时间方面 :
% : 印出
% %n : 下一行
%t : 跳格
%H : 小时(00..23)
%I : 小时(01..12)
%k : 小时(0..23)
%l : 小时(1..12)
%M : 分钟(00..59)
%p : 显示本地 AM 或 PM
%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 %S : 秒(00..61)
%T : 直接显示时间 (24 小时制)
%X : 相当于 %H:%M:%S
%Z : 显示时区
日期方面 :
%a : 星期几 (Sun..Sat)
%A : 星期几 (Sunday..Saturday)
%b : 月份 (Jan..Dec)
%B : 月份 (January..December)
%c : 直接显示日期和时间
%d : 日 (01..31)
%D : 直接显示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第几天 (001..366)
%m : 月份 (01..12)
%U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形)
%w : 一周中的第几天 (0..6)
%W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形)
%x : 直接显示日期 (mm/dd/yy)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000..9999)
若是不以加号作为开头,则表示要设定时间,而时间格式为 MMDDhhmm[[CC]YY][.ss],
其中 MM 为月份,
DD 为日,
hh 为小时,
mm 为分钟,
CC 为年份前两位数字,
YY 为年份后两位数字,
ss 为秒数
把计 :
-d datestr : 显示 datestr 中所设定的时间 (非系统时间)
--help : 显示辅助讯息
-s datestr : 将系统时间设为 datestr 中所设定的时间
-u : 显示目前的格林威治时间
--version : 显示版本编号
例子 :
显示时间后跳行,再显示目前日期 : date +%T%n%D
显示月份和日数 : date +%B %d
显示日期和设定时间(12:34:56) : date --date 12:34:56
设置系统当前时间(12:34:56):date --s 12:34:56
注意 : 当你不希望出现无意义的 0 时(比如说 1999/03/07),则能在标记中插入 - 符号,比如说 date +%-H:%-M:%-S 会把时分秒中无意义的 0 给去掉,像是原本的 08:09:04 会变为 8:9:4。另外,只有取得权限者(比如说 root)才能设定系统时间。 当你以 root 身分更改了系统时间之后,请记得以 clock -w 来将系统时间写入 CMOS 中,这样下次重新开机时系统时间才会持续抱持最新的正确值。
ntp时间同步
linux系统下默认安装了ntp服务,手动进行ntp同步如下
ntpdate ntp1.nl.net
当然,也能指定其他的ntp服务器
-------------------------------------------------------------------
扩展功能
date 工具可以完成更多的工作,不仅仅只是打印出当前的系统日期。您可以使用它来得到给定的日期究竟是星期几,并得到相对于当前日期的相对日期。了解某一天是星期几
GNU 对 date 命令的另一个扩展是 -d 选项,当您的桌上没有日历表时(UNIX 用户不需要日历表),该选项非常有用。使用这个功能强大的选项,通过将日期作为引号括起来的参数提供,您可以快速地查明一个特定的日期究竟是星期几:
$ date -d "nov 22"
Wed Nov 22 00:00:00 EST 2006
$
在本示例中,您可以看到今年的 11 月 22 日是星期三。
所以,假设在 11 月 22 日召开一个重大的会议,您可以立即了解到这一天是星期三,而这一天您将赶到驻地办公室。
获得相对日期
d 选项还可以告诉您,相对于 当前日期若干天的究竟是哪一天,从现在开始的若干天或若干星期以后,或者以前(过去)。通过将这个相对偏移使用引号括起来,作为 -d 选项的参数,就可以完成这项任务。
例如,您需要了解两星期以后的日期。如果您处于 Shell 提示符处,那么可以迅速地得到答案:
$ date -d ’2 weeks’
关于使用该命令,还有其他一些重要的方法。使用 next/last指令,您可以得到以后的星期几是哪一天:
$ date -d ’next monday’ (下周一的日期)
$ date -d next-day +%Y%m%d(明天的日期)或者:date -d tomorrow +%Y%m%d
$ date -d last-day +%Y%m%d(昨天的日期) 或者:date -d yesterday +%Y%m%d
$ date -d last-month +%Y%m(上个月是几月)
$ date -d next-month +%Y%m(下个月是几月)
使用 ago 指令,您可以得到过去的日期:
$ date -d ’30 days ago’ (30天前的日期)
您可以使用负数以得到相反的日期:
$ date -d ’dec 14 -2 weeks’ (相对:dec 14这个日期的两周前的日期)
$ date -d ’-100 days’ (100天以前的日期)
$ date -d ’50 days’(50天后的日期)
这个技巧非常有用,它可以根据将来的日期为自己设置提醒,可能是在脚本或 Shell 启动文件中,如下所示:
DAY=`date -d ’2 weeks’ +"%b %d"`
if test "`echo $DAY`" = "Aug 16"; then echo ’Product launch is now two weeks away!’; fi
posted @ 2013-02-07 12:28 xzc 阅读(5008) | 评论 (0)编辑 收藏

Sybase 函数

 

Sybase字符串函数

长度和语法分析
datalength(char_expr)
在char_expr中返回字符的长度值,忽略尾空
substring(expression,start,length)
返回部分字符串
right(char_expr,int_expr)
返回char_expr右边的int_expr字符
基本字符串运算
upper(char_expr)
把char_expr转换成大写形式
lower(char_expr)
把char_expr转换成小写形式
space(int_expr)
生成有int_expr个空格的字符串
replicate(char_expr,int_expr)
重复char_expr,int_expr次
stuff(expr1,start,length,expr2)
用expr2代替epxr1中start起始长为length的字符串
reverse(char_expr)
反写char_expr中的文本
ltrim(char_expr)
删除头空
rtrim(char_expr)
删除尾空
格式转换
ascii(char_expr)
返回char_expr中第一个字符的ASCII值
char(int_expr)
把ASCII码转换为字符
str(float_expr[,length[,decimal]])
进行数值型到字符型转换
soundex(char_expr)
返回char_expr的soundex值
difference(char_expr1,char_expr2)
返回表达式soundex值之差
串内搜索
charindex(char_expr,expression)
返回指定char_expr的开始位置,否则为0
patindex("%pattern%",expression)
返回指定样式的开始位置,否则为0
  
datalength
用于确定可变字符串的长度
soundex
用于确定字符串是否发音相似
difference
返回0-4之间的值,0表示最不相似,4表示最相似
通配符
%
匹配任何数量的字符或无字符
_
匹配任何单个字符(空间占位符)
[]
规定有效范围,或某个"OR"条件
    [ABG]   A,B,G
    [A-C]   A,B,C
    [A-CE-G] A,B,C,E,F,G
    [^ABG]
除了A,B,G
    [^A-C]  
除了A,B,C
  
escape
子句
用某个转义字符可在搜索字符串时将通配符作为文字来包含。
ANSI-89 SQL
标准定义了escape子句指定某个转义字符
缺省情况下,[]来转义某个通配符,例:
select * from test_tab
    where description like "%20[%]%"
语法:
like char_expression escape escape_character

select * from test_tab
    where description like "%20#%%" escape "#"
+
可用于串接字符
select au_laname+","+au_fname from authors
  
数学函数
abs(numeric_expr)
返回指定值的绝对值
ceiling(numeric_expr)
返回大于或等于指定值的最小整数
exp(float_expr)
给出指定值的指数值
floor(numeric_expr)
返回小于或等于指定值的最大整数
pi()
返回常数3.1415926
power(numeric_expr,power)
返回numeric_expr的值给power的幂
rand([int_expr])
返回0-1之间的随机浮点数,可指定基值
round(numeric_expr,int_expr)
把数值表达式圆整到int_expr指定的精度
sign(int_expr)
返回正+1,零0或负-1
sqrt(float_expr)
返回指定值的平方根
SQL SERVER
支持所有标准的三角函数和其他有用的函数
  
日期函数
getdate()
返回当前的系统日期和时间
datename(datepart,date_expr)
以字符串形式返回date_expr指定部分的值,转换成合适的名字
datepart(datepart,date_expr)
作为整数返回date_expr值的指定部分
datediff(datepart,date_expr1,date_expr2)
返回date_expr2-date_expr1,通过指定的datepart度量
dateadd(datepart,number,date_expr)
返回日期,通过在date_expr上增加指定number的日期部件而产生的
  
datepart
日期部件   缩写   值范围
yy   1753-9999
季度 qq   1-4
mm   1-12
每年中的天   dy   1-366
dd   1-31
星期 wk   1-54
星期天 dw   1-7(1=sunday)
小时 hh   0-23
分钟 mi   0-59
ss   0-59
毫秒 ms   0-999
例:
select invoice_no,
    datediff(dd,date_shipped,getdate())
    from invoices
    where balance_due>0
  
转换函数convert
此函数把值从一种类型改变成另一种类型
convert(datetype [(length)],expression)
select "Advance="+convert(char(12),advance)
    from titles

日期转换
convert(datetype[(length)],expression,format)
format
指定将日期转换为什么格式,有以下值:
没有世纪   有世纪 转换字符串中日期格式
    0 or 100   mon dd yyy hh:miAM(or PM)
1 101 mm/dd/yy
2 102 yy.mm.dd
3 103 dd/mm/yy
4 104 dd.mm.yy
5 105 dd-mm-yy
6 106 dd mon yy
7 107 mon dd,yy
8 108 hh:mm:ss
    9 or 109   mon dd,yyyy hh:mi:ss:mmmAM(or PM)
10 110 mm-dd-yy
11 111 yy/mm/dd
12 112 yymmdd
  
系统函数
函数       定义
访问和安全性信息
host_id()      
客户进程的当前主机进程ID号
host_name()       
客户进程的当前主计算机名
suser_id(["login_name"])  
用户的SQL Server ID
suser_name([server_user_id])  
用户的SQL Server登录名
user_id(["name_in_db"])
用户在数据库中的ID号
user_name([user_id])
用户在数据库中的名字
user         
用户在数据库中的名字
show_role()       
用户的当前活动角色

数据库和对象信息
db_id(["db_name"]) 数据库ID号
db_name([db_id])   
数据库名
object_id("objname")
数据库对象ID号
object_name(obj_id])
数据库对象号
col_name(obj_id,col_id)
对象的栏名
col_length("objname","colname")  
栏的长度
index_col("objname",index_id,key#)  
已索引的栏名
valid_name(char_expr)
若char_expr不是有效标识符,则返回0

数据函数
datalength(expression) 按字节返回expression的长度
tsequal(timestamp1,timestamp2)  
比较时戳值,若时戳值不匹配,则返回出错消息
  
isnull()
isnull
函数用指定的值代替查询栏或合计中的空值
例:
select avg(isnull(total_order,$0))
    from invoices

 

posted @ 2012-08-21 10:49 xzc 阅读(5164) | 评论 (1)编辑 收藏

日期函数

getdate()

得到当前时间,可以设置得到各种时间格式.

datepart(日期部分,日期)

取指定时间的某一个部分,年月天时分秒.

datediff(日期部分,日期1,日期2)

计算指定的日期1和日期2的时间差多少.

dateadd(日期部分,数值表达式,日期)

计算指定时间,再加上表达式指定的时间长度.

 

--取时间的某一个部分

 

select datepart(yy,getdate()) --year

select datepart(mm,getdate()) --month

select datepart(dd,getdate()) --day

select datepart(hh,getdate()) --hour

select datepart(mi,getdate()) --min

select datepart(ss,getdate()) --sec

 

--取星期几

 

set datefirst 1

select datepart(weekday,getdate()) --weekday

 

--字符串时间

 

select getdate() -- '03/11/12'

select convert(char,getdate(),101) -- '09/27/2003'

select convert(char,getdate(),102) -- '2003.11.12'

select convert(char,getdate(),103) -- '27/09/2003'

select convert(char,getdate(),104) -- '27.09.2003'

select convert(char,getdate(),105) -- '27-09-2003'

select convert(char,getdate(),106) -- '27 Sep 2003'

select convert(char,getdate(),107) --'Sep 27, 2003'

select convert(char,getdate(),108) --'11:16:06'

select convert(char,getdate(),109) --'Sep 27 2003 11:16:28:746AM'

select convert(char,getdate(),110) --'09-27-2003'

select convert(char,getdate(),111) --'2003/09/27'

select convert(char,getdate(),112) --'20030927'

select rtrim(convert(char,getdate(),102))+' '+(convert(char,getdate(),108)) -- '2003.11.12 11:03:41'

 

--整数时间

 

select convert(int,convert(char(10),getdate(),112)) -- 20031112

select datepart(hh,getdate())*10000 + datepart(mi,getdate())*100 + datepart(ss,getdate()) -- 110646

 

--时间格式 "YYYY.MM.DD HH:MI:SS" 转换为 "YYYYMMDDHHMISS"

 

declare @a datetime,@tmp varchar(20),@tmp1 varchar(20)

select @a=convert(datetime,'2004.08.03 12:12:12')

select @tmp=convert(char(10),@a,112)

select @tmp

select @tmp1=convert(char(10),datepart(hh,@a)*10000 + datepart(mi,@a)*100 + datepart(ss,@a))

select @tmp1

select @tmp=@tmp+@tmp1

select @tmp

 

 

--当月最后一天

 

declare

@tmpstr varchar(10)

@mm int,

@premm int,

@curmmlastday varchar(10)

begin

select @mm=datepart(month,getdate())--当月

select @premm=datepart(month,dateadd(month,-1,getdate())) --上个月

if (@mm>=1 and @mm<=8)

select @tmpstr=convert(char(4),datepart(year,getdate()))+'.0'+convert(char(1),datepart(month,dateadd(month,1,getdate())))+'.'+'01'

else if (@mm>=9 and @mm<=11)

select @tmpstr=convert(char(4),datepart(year,getdate()))+'.'+convert(char(2),datepart(month,dateadd(month,1,getdate())))+'.'+'01'

else

select @tmpstr=convert(char(4),datepart(year,dateadd(year,1,getdate())))+'.0'+convert(char(1),datepart(month,dateadd(month,1,getdate())))+'.'+'01'

select @curmmlastday=convert(char(10),dateadd(day,-1,@tmpstr),102) --当月最后一天

end

 

源文档 <http://hi.baidu.com/hwaspf/blog/item/a0ef87be66326e0d18d81f17.html>

 

posted @ 2012-08-21 10:49 xzc 阅读(5053) | 评论 (0)编辑 收藏
     摘要: 转自:http://software.intel.com/zh-cn/articles/javascript-first-class-citizen-function/?cid=sw:prccsdn229032简介在很多传统语言(C/C++/Java/C#等)中,函数都是作为一个二等公民存在,你只能用语言的关键字声明一个函数然后调用它,如果需要把函数作为参数传给另一个函数,或是赋值给一个本地变量,...  阅读全文
posted @ 2012-07-24 13:45 xzc 阅读(4615) | 评论 (0)编辑 收藏
因为之前使用的是Oralce所以在摸索使用用Sybase很长一段时间后,总结了一下Sybase IQ的使用
  
  心得和大家分享,希望对大家会有帮助。
  
  1、字母大小写比对不敏感,也就是在值比对判断时大小写字母都一样;
  2、等值,或<>判断,系统默认对等式两边比对值去右边空格再进行比较;
  3、GROUP BY 可以根据SELECT字段或表达式的别名来 汇总,在编写时也尽量避免SELECT 语句的别
  
  名与FROM表中的字段有重复,不然会出现莫名其妙的错误;
  4、FROM后的子查询 要定义别名才可使用;
  5、存储过程要返回IQ系统错误信息 SQLCODE || ERRORMSG(*) :(两者都为EXCEPTION后第一条SQL
  
  语句才有效果);
  6、IQ中若采用 FULL JOIN 连接则不能使用 WHERE 条件,否则FULL JOIN将失效,要筛选条件则用
  
  子查询先过滤记录后再FULL JOIN;
  7、建表时,字段默认为非空;
  8、UPDATE语句,如果与目标表关联的表有多条,则不会报错,而是随机取一条更新(第一条);
  9、RANK() OVER(PARTITION BY .. ORDER BY ..) 分组分析函数,相同的ORDER BY值,返回顺序值
  
  一样,且PARTITION BY 只支持一个字段或一个字段组(需多个字段分组的则要用 || 拼为一个字
  
  段(待确认,该问题以前碰过一次,再次验证却不存在这问题))
  10、返回可读的 全局唯一字符:UUIDTOSTR(NEWID())
  11、存储过程隐式游标语法:
  FOR A AS B CURSOR FOR SELECT ... FROM ... 
  DO
  .... 过程语句
  END FOR;
  需要注意的时,这边的A 和 B 在 过程语句中都不能引用,所以为避免过程语句其他字段名与FOR 
  
  SELECT 语句的字段名称重复,FOR SELECT 语句的字段最好都定义别名区分
  12、根据SELECT 语句建立[临时]表的方法(ORACLE的CREATE TABLE)为 SELECT ..[*] INTO [#]
  
  table_name FROM ..; 其中如果在table_name加前缀#,则为会话级临时表,否则为实体表;
  13、因Sybase为列存储模式,在执行上INSERT语句会比UPDATE语句慢,尤其表数据越多INSERT效率
  
  就越慢;所以在ETL时建议多用UPDATE而不是INSERT
  14、虽说Sybase为列存储模式,每个字段上都有默认索引,但对于经常的两表的关联键还是要建立
  
  索引否则会经常报QUERY_TEMP_SPACE_LIMIT不足的错误;
  15、存储过程中也可以显示的执行DDL语句,这点与Oracle不同;
  16、空字符串''在Sybase中也是个字符而不是null值,这点要注意;
  17、调整SESSION的临时空间SET TEMPORARY OPTION QUERY_TEMP_SPACE_LIMIT = '150000'; 15000
  
  为大小,如写0则没限制大小
  ==================================常用函数===========================================
  字符串函数
  1)ISNULL(EXP1,EXP2,EXP3,...) :返回第一个非空值,用法与COALESCE(exp1,exp2[,exp3...])相
  
  同
  3)TRIM(exp) :去除两边空格
  4)DATEFORMAT(date_exp,date_format) :日期型转字符型;
  5)STRING(exp):转为字符型;
  6)SUBSTRING(exp,int-exp1,[int-exp2]):截取exp从int-exp1开始,截取int-exp2个字符;
  7)REPLACE(o-exp,search-exp,replace-exp):从o-exp搜索search-exp,替换为replace-exp;
  8)SPACE(int_exp):返回int个空格;
  8)UPPER(exp):转为大写字母,等价于UCASE(exp);
  8)LOWER(exp):转为小写字母,
  8)CHARINDEX(exp1,exp2):返回exp2字符串中exp1的位置!定位,exp1 查找的字符,exp2 被查找
  
  的字符串;
  8)DATALENGTH(CHAR_EXPR):在char_expr中返回字符的长度值,忽略尾空;
  8)RIGHT(char_expr,int_expr):返回char_expr右边的int_expr个字符;
  8)LEFT(char_expr,int_expr):返回char_expr左边的int_expr个字符;
  8)REPLICATE(char_expr,int_expr):重复char_expr,int_expr次;
  8)STUFF(expr1,start,length,expr2):用expr2代替epxr1中start起始长为length的字符串;
  8)REVERSE(char_expr):反写char_expr中的文本;
  8)LTRIM(char_expr):删除头空;
  8)RTRIM(char_expr):删除尾空;
  8)STR(float_expr[,length[,decimal]]):进行数值型到字符型转换;
  8)PATINDEX("%pattern%",expression):返回指定样式的开始位置,否则为0;
  8)NULLIF(exp1,exp1):比较两个表达式,如果相等则返回null值,否则返回exp1
  8)NUMBER(*):返回序号,相当于ORACLE的rowid,但有区别;
  其他函数
  8)RANK() OVER(PARTITION BY .. ORDER BY ..) 分组分析函数,相同的ORDER BY值,返回顺序值
  
  一样,且PARTITION BY 只支持一个字段或一个字段组(需多个字段分组的则要用 || 拼为一个字
  
  段(待确认))
  8)返回可读的 全局ID UUIDTOSTR(NEWID())
  8)COL_LENGTH(tab_name,col_name):返回定义的列长度;兼容性:IQ&ASE
  8)LENGTH(exp):返回exp的长度;兼容性:IQ
  转换函数
  8)CONVERT(datetype,exp[,format-style]):字符转日期型 或DATE(exp);兼容性:IQ&ASE
  format-style值 输出:
  112 yyyymmdd
  120 yyyy-mm-dd hh:nn:ss
  SELECT CONVERT(date,'20101231',112),CONVERT(varchar(10),getdate(),120) ; 
  --结果 
   2010-12-31 2011-04-07
  8)CAST(exp AS data-type):返回转换为提供的数据类型的表达式的值; 兼容性:IQ
  日期函数
  8)DAY(date_exp):返回日期天值,DAYS(date_exp,int):返回日期date_exp加int后的日期;MONTH
  
  与MONTHS、YEAR与YEARS同理;
  8)DATE(exp):将表达式转换为日期,并删除任何小时、分钟或秒;兼容性:IQ
  8)DATEPART(date-part,date-exp): 返回日期分量的对应值(整数);
  8)GETDATE():返回系统时间;
  8)DATENAME(datepart,date_expr):以字符串形式返回date_expr指定部分的值,转换成合适的名字
  
  ;
  8)DATEDIFF(datepart,date_expr1,date_expr2):返回date_expr2-date_expr1,通过指定的
  
  datepart度量;
  8)DATEADD(date-part,num-exp,date-exp):返回按指定date-part分量加num-exp值后生成的
  
  date-exp值;兼容性:IQ&ASE
  date-part日期分量代表值:
  缩写 值
  YY 0001-9999
  QQ 1-4
  MM 1-12
  WK 1-54
  DD 1-31
  DY 1--366
  DW 1-7(周日-周六)
  HH 0-23
  MI 0-59
  SS 0-59
  MS 0-999
  数值函数
  8)CEIL(num-exp):返回大于或等于指定表达式的最小整数;兼容性:IQ&ASE;
  8)FLOOR(numeric_expr):返回小于或等于指定值的最大整数;
  8)ABS(num-exp):返回数值表达式的绝对值;兼容性:IQ&ASE;
  8)TRUNCNUM(1231.1251,2):截取数值;不四舍五入;
  8)ROUND(numeric_expr,int_expr):把数值表达式圆整到int_expr指定的精度;
  8)RAND([int_expr]):返回0-1之间的随机浮点数,可指定基值;
  8)SIGN(int_expr):返回正+1,零0或负-1;
  8)SQRT(float_expr):返回指定值的平方根; 
  8)PI():返回常数3.1415926;
  8)POWER(numeric_expr,power):返回numeric_expr的值给power的幂;
  8)EXP(float_expr):给出指定值的指数值;
  
  ==================================常用DDL语句
  
  ===========================================
  Sybase中DDL语句不能修改字段的数据类型,只能修改空与非空:
  1.删除列:
  ALTER TABLE table_name DELETE column_name;
  2.增加列:
  ALTER TABLE table_name ADD (column_name DATA_TYPE [NOT] NULL);
  3.修改列的空与非空:
  ALTER TABLE table_name MODIFY column_name [NOT] NULL;
  4.修改列名:
  ALTER TABLE table_name RENAME old_column_name TO new_column_name;
  5.快速建立临时表:
  SELECT * INTO [#]table_name FROM .....;
  6、修改表名:
  ALTER TABLE old_table_name RENAME new_table_name
  7.增加主键约束:
  ALTER TABLE tb_name ADD CONSTRAINT pk_name PRIMARY KEY(col_name,..)
  8.删除主键约束:
  ALTER TABLE tb_name DROP CONSTRAINT pk_name;
  9.建立自增长字段,与Oracle的SEQUENCE类似:
  CREATE TABLE TMP_001 (RES_ID INTEGER IDENTITY NOT NULL);
  10.添加表注释:
  COMMENT ON TABLE table_name IS '....';
  11.创建索引:
  CREATE INDEX index_name ON table_name(column_name);
posted @ 2012-06-18 10:57 xzc 阅读(5656) | 评论 (0)编辑 收藏
     摘要: Postgres 格式化函数提供一套有效的工具用于把各种数据类型(日期/时间,int,float,numeric)转换成格式化的字符串以及反过来从格式化的字符串转换成原始的数据类型。注意:所有格式化函数的第二个参数是用于转换的模板。表 5-7. 格式化函数  函数返回描述例子to_char(timestamp, text)text把 timestamp 转换成 str...  阅读全文
posted @ 2012-03-20 09:09 xzc 阅读(4680) | 评论 (0)编辑 收藏
仅列出标题
共32页: First 上一页 5 6 7 8 9 10 11 12 13 下一页 Last