<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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 閱讀(5128) | 評論 (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 閱讀(2155) | 評論 (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 閱讀(975) | 評論 (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 閱讀(4717) | 評論 (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 閱讀(5015) | 評論 (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 閱讀(5171) | 評論 (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 閱讀(5057) | 評論 (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 閱讀(4625) | 評論 (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 閱讀(5666) | 評論 (0)編輯 收藏
         摘要: Postgres 格式化函數提供一套有效的工具用于把各種數據類型(日期/時間,int,float,numeric)轉換成格式化的字符串以及反過來從格式化的字符串轉換成原始的數據類型。注意:所有格式化函數的第二個參數是用于轉換的模板。表 5-7. 格式化函數  函數返回描述例子to_char(timestamp, text)text把 timestamp 轉換成 str...  閱讀全文
    posted @ 2012-03-20 09:09 xzc 閱讀(4689) | 評論 (0)編輯 收藏
    僅列出標題
    共32頁: First 上一頁 5 6 7 8 9 10 11 12 13 下一頁 Last 
    主站蜘蛛池模板: 2021在线永久免费视频| 亚洲男人av香蕉爽爽爽爽| a毛片免费全部播放完整成| 亚洲欧美成人综合久久久| 国产成人无码精品久久久免费| 亚洲成AV人片久久| 亚洲成色www久久网站夜月| 又粗又硬又大又爽免费视频播放| 性色午夜视频免费男人的天堂| 性生大片视频免费观看一级| 亚洲gay片在线gv网站| 亚洲成aⅴ人在线观看| 亚洲无线电影官网| 色噜噜AV亚洲色一区二区| 国产成人涩涩涩视频在线观看免费| 日本免费一区二区在线观看| 无码人妻一区二区三区免费n鬼沢 无码人妻一区二区三区免费看 | 亚洲国产精品成人久久蜜臀| 毛片a级毛片免费观看免下载| 久爱免费观看在线网站| 两个人看的www免费高清| 无人视频在线观看免费播放影院| 亚洲成a人无码亚洲成www牛牛| 亚洲一级毛片免费看| 亚洲精品一卡2卡3卡三卡四卡| 亚洲成年人在线观看| 亚洲gv白嫩小受在线观看| 成人五级毛片免费播放| 日韩在线播放全免费| 97无码免费人妻超级碰碰夜夜 | 亚洲国产成人片在线观看无码 | 亚洲国产精品综合久久20| 亚洲中文字幕久久精品无码2021| 婷婷久久久亚洲欧洲日产国码AV| 国产亚洲老熟女视频| 亚洲午夜久久久久久久久电影网| 亚洲中文无韩国r级电影| 亚洲无线一二三四区手机| 免费一级毛片在级播放| 亚洲国产综合无码一区二区二三区| 免费大片黄手机在线观看|