存档

2010年7月 的存档

去掉ECSHOP版权 标志

2010年7月18日 没有评论

前台部分:

1:去掉头部TITLE部分的ECSHOP演示站 Powered by ecshop

前者在后台商店设置 – 商店标题修改

后者打开includes/lib_main.php

$page_title = $GLOBALS[‘_CFG’][‘shop_title’] . ‘ – ‘ . ‘Powered by ECShop’;

修改这里的’Powered by ECShop

2.去掉友情链接部分

在后台的友情链接管理里修改

3.去掉底部的Powered by ecshop 270

打开 js/common.js    

删除第244行:onload = function()

  第244行函数如下:
  onload = function()
  {
  var link_arr = document.getElementsByTagName(String.fromCharCode(65));
  var link_str;
  var link_text;
  var regg, cc;
  var rmd, rmd_s, rmd_e, link_eorr = 0;
  var e = new Array(97, 98, 99,
   100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
   110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
   120, 121, 122
   );
  
   try
   {
  for(var i = 0; i < link_arr.length; i++)
  {
   link_str = link_arr.href;
   if (link_str.indexOf(String.fromCharCode(e[22], 119, 119, 46, e[4], 99, e[18], e[7], e[14],
   e[15], 46, 99, 111, e[12])) != -1)
   {
   if ((link_text = link_arr.innerText) == undefined)
   {
   throw "noIE";
   }
   regg = new RegExp(String.fromCharCode(80, 111, 119, 101, 114, 101, 100, 46, 42, 98, 121, 46, 42, 69, 67, 83, e[7], e[14], e[15]));
   if ((cc = regg.exec(link_text)) != null)
   {
   if (link_arr.offsetHeight == 0)
   {
   break;
   }
   link_eorr = 1;
   break;
   }
   }
   else
   {
   link_eorr = link_eorr ? 0 : link_eorr;
   continue;
   }
  }
   } // IE
   catch(exc)
   {
  for(var i = 0; i < link_arr.length; i++)
  {
   link_str = link_arr.href;
   if (link_str.indexOf(String.fromCharCode(e[22], 119, 119, 46, e[4], 99, 115, 104, e[14],
   e[15], 46, 99, 111, e[12])) != -1)
   {
   link_text = link_arr.textContent;
   regg = new RegExp(String.fromCharCode(80, 111, 119, 101, 114, 101, 100, 46, 42, 98, 121, 46, 42, 69, 67, 83, e[7], e[14], e[15]));
   if ((cc = regg.exec(link_text)) != null)
   {
   if (link_arr.offsetHeight == 0)
   {
   break;
   }
   link_eorr = 1;
   break;
   }
   }
   else
   {
   link_eorr = link_eorr ? 0 : link_eorr;
   continue;
   }
  }
   } // FF
  
   try
   {
  rmd = Math.random();
  rmd_s = Math.floor(rmd * 10);
  if (link_eorr != 1)
  {
   rmd_e = i – rmd_s;
   link_arr[rmd_e].href = String.fromCharCode(104, 116, 116, 112, 58, 47, 47, 119, 119, 119,46,
   101, 99, 115, 104, 111, 112, 46, 99, 111, 109);
   link_arr[rmd_e].innerHTML = String.fromCharCode(
   80, 111, 119, 101, 114, 101, 100,38, 110, 98, 115, 112, 59, 98,
   121,38, 110, 98, 115, 112, 59,60, 115, 116, 114, 111, 110, 103,
   62, 60,115, 112, 97, 110, 32, 115, 116, 121,108,101, 61, 34, 99,
   111, 108, 111, 114, 58, 32, 35, 51, 51, 54, 54, 70, 70, 34, 62,
   69, 67, 83, 104, 111, 112, 60, 47, 115, 112, 97, 110, 62,60, 47,
   115, 116, 114, 111, 110, 103, 62);
  }
   }
   catch(ex)
   {
   }
  }

再打开模板文件夹的 library/page_footer.lbi

删除 {foreach from=$lang.p_y item=pv}{$pv}{/foreach}{$licensed}

后台部分:

1.去除两张图片

admin/images/ecshop_logo.gif

admin/images/login.png

2.右上角的“关于ECSHOP”

打开admin/templates/top.htm

删除: <li><a href="index.php?act=about_us" target="main-frame">{$lang.about}</a></li>

3.中部 ECSHOP 管理中心, 和底部的版权所有

打开language/zh_cn/admin/common.php

$_LANG[‘cp_home’] = ‘ECSHOP 管理中心’;
$_LANG[‘copyright’] = ‘版权所有 &copy; 2005-2009 上海商派网络科技有限公司,并保留所有权利。’;

作者:wjjlovewjl@善水访谈
地址:http://www.php600.cn/read.php/811.htm

分类: 其他 标签:

PHP获取QQ邮箱用户好友的方法【转】

2010年7月14日 1 条评论

我用php做了改写,可能有不完善的地方。

附件中有代码,

主要的类为class.qqhttp.php

<?php
/**
* @file class.qqhttp.php
* qq邮箱登陆获取类
* @author wc<cao8222@gmail.com>
* @date 2009-04-27
*/

class QQHttp {

   var $cookie = ”;

   function __cunstrut() {
   }

   function makeForm() {
       $form = array(
           ‘url’ => "http://mail.qq.com/cgi-bin/loginpage",
       );
       $data = $this->curlFunc($form);
       preg_match(‘/name="ts"\svalue="(\d+)"/’,$data[‘html’], $tspre);
       $ts = $tspre[1];
       preg_match(‘/action="http:\/\/(m\d+)\.mail\.qq\.com/’,$data[‘html’], $server);
       $server_no = $server[1];

       /*login.html 载入 */
       $html = file_get_contents(dirname(__FILE__).’/login.htm’);
       $html = str_replace(‘{_ts_}’,$ts, $html);
       $html = str_replace(‘{_server_no_}’,$server_no, $html);
       return $html;
   }

   function curlFunc($array)
   {
       $ch = curl_init();
       curl_setopt($ch, CURLOPT_URL, $array[‘url’]);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
       if( isset($array[‘header’]) && $array[‘header’] ) {
           curl_setopt($ch, CURLOPT_HEADER, 1);
       }
       if(isset($array[‘httpheader’])) {
           curl_setopt($ch, CURLOPT_HTTPHEADER, $array[‘httpheader’]);
       }
       if(isset($array[‘referer’])) {
           curl_setopt($ch, CURLOPT_REFERER, $array[‘referer’]);
       }
       if( isset($array[‘post’]) ) {
           curl_setopt($ch, CURLOPT_POST, 1 );
           curl_setopt($ch, CURLOPT_POSTFIELDS, $array[‘post’]);
       }
       if( isset($array[‘cookie’]) ){
           curl_setopt($ch, CURLOPT_COOKIE, $array[‘cookie’]);
       }
       $r[‘erro’] = curl_error($ch);
       $r[‘errno’] = curl_errno($ch);
       $r[‘html’] = curl_exec($ch);
       $r[‘http_code’] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
       curl_close($ch);
       return $r;
   }

   /**
    * 获取验证码图片和cookie
    * @param Null
    *
    * @return array(‘img’=>String, ‘cookie’=>String)
    */
   function getVFCode ()
   {
       $t = ‘http://m127.mail.qq.com/cgi-bin/getverifyimage?aid=23000101&0.8881121444410955’;
       $t = ‘ttp://mail.qq.com/cgi-bin/getinvestigate?t=loginpage&stat=verifyimg&verifyuser=49450402’;
       $vfcode = array(
           ‘header’ => true,
           ‘cookie’ => false,
           ‘url’=>’http://’.$_GET[‘server_no’].’.mail.qq.com/cgi-bin/getverifyimage?aid=’.$_GET[‘aid’].’&’.@$_GET[‘t’],
       );
       //var_dump($vfcode);

       $r = $this->curlFunc($vfcode);
       if ($r[‘http_code’] != 200 ) return false;
       $data = split("\n", $r[‘html’]);
       //var_dump($data);exit;
       preg_match(‘/verifyimagesession=([^;]+);/’,$data[7], $temp);
       $cookie = trim($temp[1]);
       $img = $data[11];
       returnarray(‘img’=>$img,’cookie’=>$cookie, ‘data’=>$data);
   }

   /**
    * 登陆qq邮箱
    *
    * @param $cookie getvfcode中生成的cookie
    *
    * @return array(
    *  sid=>String , //用户认证的唯一标示
    *  login => Boolean, //true 登陆成功 ,false 登陆失败
    *  server_no => String // 服务器编号
    *  active => Boolean //true 已开通 ,false 未开通 邮箱
    *  cookie => String // 获取数据cookie
    *
    * );
    */
   function login($cookie)
   {
       /* 生成参数字符串 */
       $post = array();
       foreach($_POST as $k => $v) {
           $post[] = $k.’=’.urlencode($v);
       }
       $poststr = implode(‘&’,$post);
       $r[‘server_no’] = $_GET[‘server_no’];

       $login = array(
           ‘url’=>’http://’.$r[‘server_no’].’.mail.qq.com/cgi-bin/login?sid=0,2,zh_CN’,
           ‘header’ => true,
           ‘cookie’ => ‘verifyimagesession=’.$cookie,
           ‘referer’ => ‘http://mail.qq.com/cgi-bin/loginpage’,
           ‘httpheader’=>array(
               "Host: " . $r[‘server_no’] . ‘.mail.qq.com’,
               "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.9) Gecko/2009040821 Firefox/3.0.9 FirePHP/0.2.4",
               "Content-Type: application/x-www-form-urlencoded",
           ),
           ‘post’ => $poststr ,
       );
       $data = $this->curlFunc($login);
       $data[‘html’] = iconv("gb2312", "UTF-8", $data[‘html’]);
       if ($data[‘http_code’] != 200) {
           $this->error($data);
           return false;
       }

      // var_dump(str_replace(‘script’,”,$data));exit;
       /* 测试数据 */
       //$data[‘html’] =file_get_contents(‘./r.txt’);
       $r[‘uin’] = $_POST[‘uin’];
       /* 登陆错误的判断 */
       if (preg_match(‘|errtype=(\d)|’, $data[‘html’], $temp_err)) {
           $r[‘login’] = false;
           if ($temp_err[1] == 1) {
               $r[‘msg’] = ‘账号和密码错误’;
           } elseif ($temp_err[1] == 2) {
               $r[‘msg’] = ‘验证码错误’;
           }
           return $r;
       }
       /* 登陆成功 */
       preg_match(‘|urlHead="([^"]+)"|i’,$data[‘html’],$temp_url);
       $urlhead = $temp_url[1];
       if (preg_match(‘|frame_html\?sid=([^"]+)"|i’,$data[‘html’],$temp_sid) ) {
           $r[‘sid’] = $temp_sid[1];
           $r[‘active’] = true;
       } elseif (preg_match(‘|autoactivation\?sid=([^&]+)?&|i’,$data[‘html’],$temp_sid) ) {
           $r[‘sid’] = $temp_sid[1];
           $r[‘active’] = false;
       }
       /* 登录后cookie的获取 ,在后续操作中用到 */
       if (preg_match_all(‘|Set-Cookie:([^=]+=[^;]+)|i’, $data[‘html’], $new_cookies) ) {
           $cookiestr = implode(‘; ‘, $new_cookies[1]);
           $cookiestr .= ‘; verifyimagesession=’.$cookie;
       }

       $r[‘login’] = true;
       $r[‘cookie’] = $cookiestr;
       return $r;
   }

   function openEmail($param)
   {
       $openEmail = array(
           ‘url’=>’http://’.$param[‘server_no’].’.mail.qq.com/cgi-bin/autoactivation?actmode=6&sid=’.$param[‘sid’],
           ‘header’ => true,
           ‘cookie’ => $param[‘cookie’],
           ‘referer’ => ‘http://’.$param[‘server_no’].’mail.qq.com/cgi-bin/autoactivation?sid=’.$param[‘sid’].’&action=reg_activate&actmode=6′,
           ‘httpheader’=>array(
               "Host: " . $param[‘server_no’] . ‘.mail.qq.com’,
               ‘Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7’,
               "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.9) Gecko/2009040821 Firefox/3.0.9 FirePHP/0.2.4",
           ),
       );

       $data =$this->curlFunc($openEmail);
       if (preg_match(‘|Set-Cookie:qqmail_activated=0|i’, $data[‘html’])) {
           $param[‘active’] = true;
           $param[‘cookie’] = $param[‘cookie’] .’; qqmail_activated=0; qqmail_alias=’;
       }
       return $param;
   }

   /**
    *
    * 获取friends数据
    *
    * @param $param = array(
    *  sid=>String , //用户认证的唯一标示
    *  login => Boolean, //true 登陆成功 ,false 登陆失败
    *  server_no => String // 服务器编号
    *  active => Boolean //true 已开通 ,false 未开通 邮箱
    *  cookie => String // 获取数据cookie
    *
    * );
    * @return Array(
    *  key=>value, // key:qq号,value: nickname
    * );
    */
   function getFriends($param)
   {

       $friend = array(
           ‘url’=>’http://’.$param[‘server_no’].’.mail.qq.com/cgi-bin/addr_listall?type=user&&category=all&sid=’.$param[‘sid’],
           ‘header’ => true,
           ‘cookie’ => $param[‘cookie’],
           ‘referer’ => ‘http://m151.mail.qq.com/cgi-bin/addr_listall?sid=’.$param[‘sid’].’&sorttype=null&category=common’,
           ‘httpheader’=>array(
               "Host: " . $param[‘server_no’] . ‘.mail.qq.com’,
               ‘Accept-Charset:utf-8;q=0.7,*;q=0.7’,
               "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.9) Gecko/2009040821 Firefox/3.0.9 FirePHP/0.2.4",
           ),
       );
       $r = $this->curlFunc($friend);
       if ($r[‘http_code’] != 200) {
           $this->error($r);
           return false;
       }
       $data =$r[‘html’];
       $preg = preg_match_all(‘|<p class="L_n"><span t="1" u="(\d+)" n="([^"]+)" e="([^"]+)">|i’, $data, $temp_list);
       if ($preg == 0) return array();
       $list = array_combine($temp_list[1],$temp_list[2]);
       return $list;
   }

   /**
    * 错误显示
    *
    * @param $str array
    *
    * @return
    */
   function error($str) {
       $str[‘html’] = str_replace(‘script’,”, $str[‘html’]);
       var_dump($str);
       exit;
   }
}

?>

源码下载:http://dl.javaeye.com/topics/download/28cecf25-7c12-375d-8293-1897a8630543
原文引用:http://www.javaeye.com/topic/375434

分类: PHP 标签:

使用Python模拟登录QQ邮箱获取QQ好友列表

2010年7月14日 没有评论

      最近因开发项目的需要,有一个需求,就是很多SNS网站都有的通过Email地址导入好友列表,不过这次要导入的不是Email列表,而是QQ的好友列表。
      实现方式:
      通过google一搜,实现的方式大概有下面这篇文章提到的几种方法:
最后我选择了通过模拟登录QQ邮箱的方式来实现,该实现方式在海内网上的好友查找功能也可以看到。
      QQ邮箱的官方登陆地址是与其他大部分邮箱不同的是,如果使用纯数字的QQ号登录的话,除了密码,还需要输入验证码。
      看到海内上的QQ好友导入功能也是需要输入验证码的,而且验证码的样子和QQ邮箱的很像。由于这是需要在用户手动输入密码的情况下才能实现的功能,因此输入验证码的工作也可以让用户手动来完成。
      验证码处理:
        通过对页面的分析,QQ邮箱的验证码方式实现原理其实是很简单,当需要一张验证码图片或看不清而需要换一张时,它都是向地址发出请求,(页面上该地址是通过js生成的,为了防止浏览器缓存,地址末尾还会带有随机一个随机数),而该链接不但返回一张图片,还在http头部带有设置cookie的一段header。这样当用户提交表单的时候,浏览器就会把该cookie发送回服务器,服务器通过比较该cookie值和经过某种运算后的表单中的验证码值就可以判断验证码是否填写正确。
        现在的问题是由于cookie的安全机制,验证码图片不能直接从腾讯的服务器上去取,那样用户在将QQ和密码发送到我们的服务器时,验证码的cookie不会一起发过来。
      解决方式其实也很简单,将验证码的获取地址改为我们自己的服务器,我们的服务器作为简单的代理,从腾讯的服务器上去获取真正的验证码,再将图片内容和那段cookie发送回用户浏览器。那样用户提交表单的时候,那段cookie就又会发送回我们的服务器了。
      绕过其他验证安全机制:
      一般上有了账号,密码,验证码这3样东西就可以实现模拟登录很多网站了,但是QQ邮箱还有其他的安全机制,在QQ邮箱登陆的表单中还有一个像这样input type="hidden"name="ts"value="1234672721"/的hidden域,该value每次刷新页面都会改变,同时在表单提交的时候,还会通过js将该值与其他hidden域的值进行某些计算才正式提交表单。
      通过多次模拟登录,估计该值是用来判断登录session超时的,同时也参与其他的一些干扰加密的计算。而且该值与验证码是完全无关的,因此在显示我们表单时,只要先去抓取一下页面,从里面提取出ts值,连同其他所有hidden域和相关计算的js代码放入我们的表单中就可以了。
        因此,实际上我们的表单只需要稍微修改一下页面的内容就可以作为显示给用户的表单。主要包括以下几个方面,这里我使用的django,所以使用django的模板语法:
1、input type="hidden"name="ts"value="1234672721"/改为input type="hidden"name="ts"value="{{ts}}"/
2、表单的action地址改为我们自己这里假设为/friends/因此
form name="form1"method="post"action="onSubmit="return checkInput();"
改为
form name="form1"method="post"action="/friends/"onSubmit="return checkInput();"
3、图片验证码地址,有两个地方要改:
document.write("img id=’vfcode’src=’style=’cursor:pointer;border:1px solid#e4eef9’onclick=’changeimg()’");
改为
document.write("img id=’vfcode’src=’/qq-captcha/?aid=23000101&",Math.random(),"’style=’cursor:pointer;border:1px solid#e4eef9’onclick=’changeimg()’");
      另外一个changeimg函数内,也将相应的地址改为我们自己的服务器即可。
      改了这些,页面看上去和原来几乎一样,只是所有交互都改到了我们的服务器上,出于版权和页面统一的需要,在使用到自己的网站上时,可以使用自己设计的页面,只要表单的初始化和提交与原来一样就可以了,甚至也可以通过阅读js部分的源代码,把ts部分的计算移到服务器端进行。
示例代码:
      以下是整个views.py的代码,包括后面会讲到模拟登录部分,login和qq_captcha分别用来初始化登陆页和获取图片验证码:
      拟登录部分都在view qq_friends里面进行,基本上就像前面说得,获取图片验证码的cookie,将表单提交的值原样发送post到腾讯的服务器,如果都正确的话就可以登录了。
        发送的结果大概分为3种,验证码错误,账号或密码错误,登陆成功。不管在哪种情况下,腾讯的服务器都是返回一段js代码,通过那段代码重定向到错误页或邮箱登陆后的首页。
其中验证码错误像是下面这样:
script var urlHead="var targetUrl="";var mailto="";targetUrl=urlHead+"loginpage?"+"errtype=2"+"&verify=true"+"&clientuin=12345678"+"&t="+"&alias="+"&regalias="+"&delegate_url="+"&title="+"&url=%2Fcgi-bin%2Flogin%3Fsid%3D0%2C2%2Czh_CN"+"&org_fun="+"&aliastype=@qq.com"+"&ss="+"&from="+"&autologin=n"if(targetUrl==""){targetUrl="";}document.write("META http-equiv=Refresh content=\’0;url=\""+targetUrl+"\"\’/");/script script type="text/j***ascript"location.href=targetUrl/script
账号或密码错误是这样:
script var urlHead="var targetUrl="";var mailto="";targetUrl=urlHead+"loginpage?"+"errtype=1"+"&verify=false"+"&clientuin=1725*** 012"+"&t="+"&alias="+"&regalias="+"&delegate_url="+"&title="+"&url=%2Fcgi-bin%2Flogin%3Fsid%3D0%2C2%2Czh_CN"+"&org_fun="+"&aliastype=@qq.com"+"&ss="+"&from="+"&autologin=n"if(targetUrl==""){targetUrl="";}document.write("META http-equiv=Refresh content=\’0;url=\""+targetUrl+"\"\’/");/script script type="text/j***ascript"location.href=targetUrl/script
登录成功是这样:
script var urlHead="var targetUrl="";var mailto="";targetUrl=urlHead+"frame_html?sid=UJh1e2XMWhOEbWcu";if(targetUrl==""){targetUrl="";}document.write("META http-equiv=Refresh content=\’0;url=\""+targetUrl+"\"\’/");/script script type="text/j***ascript"location.href=targetUrl/script
其中登录成功后的反馈不但是上面的js代码,还包括一大堆cookie,与邮箱服务器的后续交互都需要用到这些cookie。
      另外上面js代码中frame_html?sid=UJh1e2XMWhOEbWcu的sid部分需要多次用到在后面抓取好友列表页面的url中,所以也需要提取出来。
登录邮箱后,就可以抓取好友列表了,可以通过先访问页面
该页面的ul class="grouplist"/ul部分可以获取好友分组名称和相应的url地址。
然后在相应的访问各个好友分组的页面的就可以获取好友列表了。
      这里由于我自己的QQ号限制,不知道如果没有好友没有分组页面会是什么情况,以及如果某个分组的好友很多的话,该好友列表页面是否会有分页(目前是没有见到分页)。有什么错误的话可以留言给我。
其他说明:
1、由于有些QQ用户给自己取火星文昵称,导致抓取的页面上很容易出现字符编码错误及HTML转义问题。
2、不知道是故意为了防止抓取还是设计不规范,好多页面用BeautifulSoup直接实例化,会导致大量信息的丢失,所以上面的代码都是尽可能先用正则表达式提取必须部分的信息。
3、由于QQ邮箱服务器的代码也在升级(事实上,我前几天刚写的代码就刚失效了,马上做了一些修改,昨天海内上的那个功能也出现了问题,看来他们也是通过QQ邮箱方式来实现的),所以并不能保证你在看到本文章时,上面的代码依然使用有效。但是总体上的思路依然可以提供参考。

分类: 其他 标签:

MySQL时间函数用法代码举例

2010年7月1日 没有评论

      今天同事临时提出一个小需求,因为后台不是很完善,这样功能只能到数据库里面直接运行SQL语句了,发现几个函数还是挺好用的。。。

       select count(*) from user where create_time >= UNIX_TIMESTAMP(‘2010-05-13’) and create_time <= UNIX_TIMESTAMP(‘2010-07-01’);

对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型。

这里是一个使用日期函数的例子。下面的查询选择了所有记录,其date_col的值是在最后30天以内:

mysql> SELECT something FROM table
WHERE TO_DAYS(NOW()) – TO_DAYS(date_col) <= 30;

DAYOFWEEK(date)
返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。这些索引值对应于ODBC标准。
mysql> select DAYOFWEEK(‘1998-02-03’);
-> 3

WEEKDAY(date)
返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。
mysql> select WEEKDAY(‘1997-10-04 22:23:00’);
-> 5
mysql> select WEEKDAY(‘1997-11-05’);
-> 2

DAYOFMONTH(date)
返回date的月份中日期,在1到31范围内。
mysql> select DAYOFMONTH(‘1998-02-03’);
-> 3

DAYOFYEAR(date)
返回date在一年中的日数, 在1到366范围内。
mysql> select DAYOFYEAR(‘1998-02-03’);
-> 34

MONTH(date)
返回date的月份,范围1到12。
mysql> select MONTH(‘1998-02-03’);
-> 2

DAYNAME(date)
返回date的星期名字。
mysql> select DAYNAME("1998-02-05");
-> ‘Thursday’

MONTHNAME(date)
返回date的月份名字。
mysql> select MONTHNAME("1998-02-05");
-> ‘February’

QUARTER(date)
返回date一年中的季度,范围1到4。
mysql> select QUARTER(’98-04-01′);
-> 2

WEEK(date)
 
WEEK(date,first)
对于星期天是一周的第一天的地方,有一个单个参数,返回date的周数,范围在0到52。2个参数形式WEEK()允许你指定星期是否开始于星期天或星期一。如果第二个参数是0,星期从星期天开始,如果第二个参数是1,从星期一开始。
mysql> select WEEK(‘1998-02-20’);
-> 7
mysql> select WEEK(‘1998-02-20’,0);
-> 7
mysql> select WEEK(‘1998-02-20’,1);
-> 8

YEAR(date)
返回date的年份,范围在1000到9999。
mysql> select YEAR(’98-02-03′);
-> 1998

HOUR(time)
返回time的小时,范围是0到23。
mysql> select HOUR(’10:05:03′);
-> 10

MINUTE(time)
返回time的分钟,范围是0到59。
mysql> select MINUTE(’98-02-03 10:05:03′);
-> 5

SECOND(time)
回来time的秒数,范围是0到59。
mysql> select SECOND(’10:05:03′);
-> 3

PERIOD_ADD(P,N)
增加N个月到阶段P(以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日期值。
mysql> select PERIOD_ADD(9801,2);
-> 199803

PERIOD_DIFF(P1,P2)
返回在时期P1和P2之间月数,P1和P2应该以格式YYMM或YYYYMM。注意,时期参数P1和P2不是日期值。
mysql> select PERIOD_DIFF(9802,199703);
-> 11

DATE_ADD(date,INTERVAL expr type)
 
DATE_SUB(date,INTERVAL expr type)
 
ADDDATE(date,INTERVAL expr type)
 
SUBDATE(date,INTERVAL expr type)
这些功能执行日期运算。对于MySQL 3.22,他们是新的。ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同义词。
在MySQL 3.23中,你可以使用+和-而不是DATE_ADD()和DATE_SUB()。(见例子)date是一个指定开始日期的
DATETIME或DATE值,expr是指定加到开始日期或从开始日期减去的间隔值一个表达式,expr是一个字符串;它可以以
一个“-”开始表示负间隔。type是一个关键词,指明表达式应该如何被解释。EXTRACT(type FROM date)函数从日期
中返回“type”间隔。下表显示了type和expr参数怎样被关联: type值 含义 期望的expr格式
SECOND 秒 SECONDS
MINUTE 分钟 MINUTES
HOUR 时间 HOURS
DAY 天 DAYS
MONTH 月 MONTHS
YEAR 年 YEARS
MINUTE_SECOND 分钟和秒 "MINUTES:SECONDS"
HOUR_MINUTE 小时和分钟 "HOURS:MINUTES"
DAY_HOUR 天和小时 "DAYS HOURS"
YEAR_MONTH 年和月 "YEARS-MONTHS"
HOUR_SECOND 小时, 分钟, "HOURS:MINUTES:SECONDS"
DAY_MINUTE 天, 小时, 分钟 "DAYS HOURS:MINUTES"
DAY_SECOND 天, 小时, 分钟, 秒 "DAYS HOURS:MINUTES:SECONDS"

MySQL在expr格式中允许任何标点分隔符。表示显示的是建议的分隔符。如果date参数是一个DATE值并且你的计算仅仅包含YEAR、MONTH 和DAY部分(即,没有时间部分),结果是一个DATE值。否则结果是一个DATETIME值。

mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;
-> 1998-01-01 00:00:00
mysql> SELECT INTERVAL 1 DAY + "1997-12-31";
-> 1998-01-01
mysql> SELECT "1998-01-01" – INTERVAL 1 SECOND;
-> 1997-12-31 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
INTERVAL 1 SECOND);
-> 1998-01-01 00:00:00
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
INTERVAL 1 DAY);
-> 1998-01-01 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
INTERVAL "1:1" MINUTE_SECOND);
-> 1998-01-01 00:01:00
mysql> SELECT DATE_SUB("1998-01-01 00:00:00",
INTERVAL "1 1:1:1" DAY_SECOND);
-> 1997-12-30 22:58:59
mysql> SELECT DATE_ADD("1998-01-01 00:00:00",
INTERVAL "-1 10" DAY_HOUR);
-> 1997-12-30 14:00:00
mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);
-> 1997-12-02
mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");
-> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
-> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");
-> 20102

如果你指定太短的间隔值(不包括type关键词期望的间隔部分),MySQL假设你省掉了间隔值的最左面部分。例如,如果你指定一个type是 DAY_SECOND,值expr被希望有天、小时、分钟和秒部分。如果你象"1:10"这样指定值,MySQL假设日子和小时部分是丢失的并且值代表分钟和秒。换句话说,"1:10" DAY_SECOND以它等价于"1:10" MINUTE_SECOND的方式解释,这对那MySQL解释TIME值表示经过的时间而非作为一天的时间的方式有二义性。如果你使用确实不正确的日期,结果是NULL。如果你增加MONTH、YEAR_MONTH或YEAR并且结果日期大于新月份的最大值天数,日子在新月用最大的天调整。

mysql> select DATE_ADD(‘1998-01-30’, Interval 1 month);
-> 1998-02-28

注意,从前面的例子中词INTERVAL和type关键词不是区分大小写的。

TO_DAYS(date)
给出一个日期date,返回一个天数(从0年的天数)。
mysql> select TO_DAYS(950501);
-> 728779
mysql> select TO_DAYS(‘1997-10-07’);
-> 729669

TO_DAYS()
不打算用于使用格列高里历(1582)出现前的值。

FROM_DAYS(N)
给出一个天数N,返回一个DATE值。
mysql> select FROM_DAYS(729669);
-> ‘1997-10-07’

DATE_FORMAT(date,format)
根据format字符串格式化date值。下列修饰符可以被用在format字符串中: %M 月名字(January……December)
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。

所有的其他字符不做解释被复制到结果中。

mysql> select DATE_FORMAT(‘1997-10-04 22:23:00’, ‘%W %M %Y’);
-> ‘Saturday October 1997’
mysql> select DATE_FORMAT(‘1997-10-04 22:23:00’, ‘%H:%i:%s’);
-> ’22:23:00′
mysql> select DATE_FORMAT(‘1997-10-04 22:23:00’,
‘%D %y %a %d %m %b %j’);
-> ‘4th 97 Sat 04 10 Oct 277’
mysql> select DATE_FORMAT(‘1997-10-04 22:23:00’,
‘%H %k %I %r %T %S %w’);
-> ’22 22 10 10:23:00 PM 22:23:00 00 6′
MySQL3.23中,在格式修饰符字符前需要%。在MySQL更早的版本中,%是可选的。

TIME_FORMAT(time,format)
这象上面的DATE_FORMAT()函数一样使用,但是format字符串只能包含处理小时、分钟和秒的那些格式修饰符。其他修饰符产生一个NULL值或0。

CURDATE()
 
CURRENT_DATE
以’YYYY-MM-DD’或YYYYMMDD格式返回今天日期值,取决于函数是在一个字符串还是数字上下文被使用。
mysql> select CURDATE();
-> ‘1997-12-15’
mysql> select CURDATE() + 0;
-> 19971215

CURTIME()
 
CURRENT_TIME
以’HH:MM:SS’或HHMMSS格式返回当前时间值,取决于函数是在一个字符串还是在数字的上下文被使用。
mysql> select CURTIME();
-> ’23:50:26′
mysql> select CURTIME() + 0;
-> 235026

NOW()
 
SYSDATE()
 
CURRENT_TIMESTAMP
以’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS格式返回当前的日期和时间,取决于函数是在一个字符串还是在数字的上下文被使用。
mysql> select NOW();
-> ‘1997-12-15 23:50:26’
mysql> select NOW() + 0;
-> 19971215235026

UNIX_TIMESTAMP()
 
UNIX_TIMESTAMP(date)
如果没有参数调用,返回一个Unix时间戳记(从’1970-01-01 00:00:00’GMT开始的秒数)。如果UNIX_TIMESTAMP()用一个date参数被调用,它返回从’1970-01-01 00:00:00′ GMT开始的秒数值。date可以是一个DATE字符串、一个DATETIME字符串、一个TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地时间的一个数字。
mysql> select UNIX_TIMESTAMP();
-> 882226357
mysql> select UNIX_TIMESTAMP(‘1997-10-04 22:23:00’);
-> 875996580
当UNIX_TIMESTAMP被用于一个TIMESTAMP列,函数将直接接受值,没有隐含的“string-to-unix-timestamp”变换。

FROM_UNIXTIME(unix_timestamp)
以’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值,取决于函数是在一个字符串还是或数字上下文中被使用。
mysql> select FROM_UNIXTIME(875996580);
-> ‘1997-10-04 22:23:00’
mysql> select FROM_UNIXTIME(875996580) + 0;
-> 19971004222300

FROM_UNIXTIME(unix_timestamp,format)
返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符。
mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),
‘%Y %D %M %h:%i:%s %x’);
-> ‘1997 23rd December 03:43:30 x’

SEC_TO_TIME(seconds)
返回seconds参数,变换成小时、分钟和秒,值以’HH:MM:SS’或HHMMSS格式化,取决于函数是在一个字符串还是在数字上下文中被使用。
mysql> select SEC_TO_TIME(2378);
-> ’00:39:38′
mysql> select SEC_TO_TIME(2378) + 0;
-> 3938

TIME_TO_SEC(time)
返回time参数,转换成秒。
mysql> select TIME_TO_SEC(’22:23:00′);
-> 80580
mysql> select TIME_TO_SEC(’00:39:38′);
-> 2378

分类: MySQL 标签: