<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[废墟]]></title> 
<link>http://anerg.com/index.php</link> 
<description><![CDATA[颓废的蛰伏，等待涅槃的辉煌]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[废墟]]></copyright>
<item>
<link>http://anerg.com/read.php?48</link>
<title><![CDATA[mysql查询今天、昨天、7天、近30天、本月、上一月 数据]]></title> 
<author>废墟 &lt;a@anerg.cn&gt;</author>
<category><![CDATA[数据库相关]]></category>
<pubDate>Fri, 11 Jun 2010 02:18:44 +0000</pubDate> 
<guid>http://anerg.com/read.php?48</guid> 
<description>
<![CDATA[ 
	今天<br/><div class="code">select * from 表名 where to_days(时间字段名) = to_days(now());</div><br/>昨天<br/><div class="code">SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) &lt;= 1</div><br/>7天<br/><div class="code">SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) &lt;= date(时间字段名)</div><br/>近30天<br/><div class="code">SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) &lt;= date(时间字段名)</div><br/>本月<br/><div class="code">SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, &#039;%Y%m&#039; ) = DATE_FORMAT( CURDATE( ) , &#039;%Y%m&#039; )</div><br/>上一月<br/><div class="code">SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , &#039;%Y%m&#039; ) , date_format( 时间字段名, &#039;%Y%m&#039; ) ) =1</div>
]]>
</description>
</item><item>
<link>http://anerg.com/read.php?25</link>
<title><![CDATA[mysql分表的详细设计与应用]]></title> 
<author>废墟 &lt;a@anerg.cn&gt;</author>
<category><![CDATA[数据库相关]]></category>
<pubDate>Tue, 16 Jun 2009 12:27:01 +0000</pubDate> 
<guid>http://anerg.com/read.php?25</guid> 
<description>
<![CDATA[ 
	一般来说，当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了，这次我来详细说说分表的一些方法。目前我所知道的方法都是MYISAM的，INNODB如何做分表并且保留事务和外键，我还不是很了解。<br/><br/>首先，我们需要想好到底分多少个表，前提当然是满足应用。这里我使用了一个比较简单的分表方法，就是根据自增id的尾数来分，也就是说分0-9一共10个表，其取值也很好做，就是对10进行取模。另外，还可以根据某一字段的md5值取其中几位进行分表，这样的话，可以分的表就很多了。<br/><br/>好了，先来创建表吧，代码如下<br/><div class="code">CREATE TABLE `test`.`article_0` ( <br/>`id` BIGINT( 20 ) NOT NULL ,<br/>`subject` VARCHAR( 200 ) NOT NULL ,<br/>`content` TEXT NOT NULL ,<br/>PRIMARY KEY ( `id` )<br/>) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci<br/><br/>CREATE TABLE `test`.`article_1` ( <br/>`id` BIGINT( 20 ) NOT NULL ,<br/>`subject` VARCHAR( 200 ) NOT NULL ,<br/>`content` TEXT NOT NULL ,<br/>PRIMARY KEY ( `id` )<br/>) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci<br/><br/>CREATE TABLE `test`.`article_2` ( <br/>`id` BIGINT( 20 ) NOT NULL ,<br/>`subject` VARCHAR( 200 ) NOT NULL ,<br/>`content` TEXT NOT NULL ,<br/>PRIMARY KEY ( `id` )<br/>) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci<br/><br/>CREATE TABLE `test`.`article_3` ( <br/>`id` BIGINT( 20 ) NOT NULL ,<br/>`subject` VARCHAR( 200 ) NOT NULL ,<br/>`content` TEXT NOT NULL ,<br/>PRIMARY KEY ( `id` )<br/>) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci<br/><br/>CREATE TABLE `test`.`article_4` ( <br/>`id` BIGINT( 20 ) NOT NULL ,<br/>`subject` VARCHAR( 200 ) NOT NULL ,<br/>`content` TEXT NOT NULL ,<br/>PRIMARY KEY ( `id` )<br/>) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci<br/><br/>CREATE TABLE `test`.`article_5` ( <br/>`id` BIGINT( 20 ) NOT NULL ,<br/>`subject` VARCHAR( 200 ) NOT NULL ,<br/>`content` TEXT NOT NULL ,<br/>PRIMARY KEY ( `id` )<br/>) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci<br/><br/>CREATE TABLE `test`.`article_6` ( <br/>`id` BIGINT( 20 ) NOT NULL ,<br/>`subject` VARCHAR( 200 ) NOT NULL ,<br/>`content` TEXT NOT NULL ,<br/>PRIMARY KEY ( `id` )<br/>) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci<br/><br/>CREATE TABLE `test`.`article_7` ( <br/>`id` BIGINT( 20 ) NOT NULL ,<br/>`subject` VARCHAR( 200 ) NOT NULL ,<br/>`content` TEXT NOT NULL ,<br/>PRIMARY KEY ( `id` )<br/>) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci<br/><br/>CREATE TABLE `test`.`article_8` ( <br/>`id` BIGINT( 20 ) NOT NULL ,<br/>`subject` VARCHAR( 200 ) NOT NULL ,<br/>`content` TEXT NOT NULL ,<br/>PRIMARY KEY ( `id` )<br/>) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci<br/><br/>CREATE TABLE `test`.`article_9` ( <br/>`id` BIGINT( 20 ) NOT NULL ,<br/>`subject` VARCHAR( 200 ) NOT NULL ,<br/>`content` TEXT NOT NULL ,<br/>PRIMARY KEY ( `id` )<br/>) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci <br/></div><br/><br/>好了10个表创建完毕了，需要注意的是，<span style="color: #FF4500;">这里的id不能设为自增，而且所有的表结构必须一致，包括结构，类型，长度，字段的顺序都必须一致</span>那么对于这个id如何取得呢？后面我会详细说明。现在，我们需要一个合并表，用于查询，创建合并表的代码如下<br/><div class="code">CREATE TABLE `test`.`article` ( <br/>`id` BIGINT( 20 ) NOT NULL ,<br/>`subject` VARCHAR( 200 ) NOT NULL ,<br/>`content` TEXT NOT NULL ,<br/>PRIMARY KEY ( `id` )<br/>) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=0 UNION=(`article_0`,`article_1`,`article_2`,`article_3`,`article_4`,`article_5`,`article_6`,`article_7`,`article_8`,`article_9`); <br/></div><br/>这里INSERT_METHOD=0在某些版本可能不工作，需要改成INSERT_METHOD=NO<br/><span style="color: #FF4500;">注意，合并表也必须和前面的表有相同的结构，类型，长度，包括字段的顺序都必须一致</span>这里的INSERT_METHOD=0表示不允许对本表进行insert操作。好了，当需要查询的时候，我们可以只对article这个表进行操作就可以了，也就是说这个表仅仅只能进行select操作<br/><br/>那么对于插入也就是insert操作应该如何来搞呢，首先就是获取唯一的id了，这里就还需要一个表来专门创建id，代码如下<br/><div class="code">CREATE TABLE `test`.`create_id` ( <br/>`id` BIGINT( 20 ) NOT NULL AUTO_INCREMENT PRIMARY KEY <br/>) ENGINE = MYISAM <br/></div><br/>也就是说，当我们需要插入数据的时候，必须由这个表来产生id值，我的php代码的方法如下<br/><div class="code" style="overflow: auto;"><code><span style="color: #000000">
function&nbsp;get_AI_ID()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;$sql&nbsp;&nbsp;=&nbsp;"insert&nbsp;into&nbsp;create_id&nbsp;(id)&nbsp;values('')";<br />&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;db-&gt;query($sql);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this-&gt;db-&gt;insertID();<br />}<br /></span>
</code></div><br/>好了，现在假设我们要插入一条数据了，应该怎么操作呢？还是继续看代码吧<br/><div class="code" style="overflow: auto;"><code><span style="color: #000000">
function&nbsp;new_Article()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;$id&nbsp;&nbsp;=&nbsp;$this-&gt;get_AI_ID();<br />&nbsp;&nbsp;&nbsp;&nbsp;$table_name&nbsp;=&nbsp;$this-&gt;get_Table_Name($id);<br />&nbsp;&nbsp;&nbsp;&nbsp;$sql&nbsp;=&nbsp;"insert&nbsp;into&nbsp;{$table_name}&nbsp;(id,subject,content)&nbsp;values('{$id}','测试标题','测试内容')";<br />&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;db-&gt;query($sql);<br />}<br />/**<br />&nbsp;*&nbsp;用于根据id获取表名<br />&nbsp;*/<br />function&nbsp;get_Table_Name($id)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;'article_'.intval($id)%10;<br />}<br /></span>
</code></div><br/>其实很简单的，对吧，就是先获取id，然后根据id获取应该插入到哪个表，然后就很简单了。<br/><br/>对于update的操作我想应该不需要再说了吧，无非是有了id，然后获取表名，然后进行update操作就好了。<br/><br/>ok，今天就到这里了，下课，同学们再见 ~~~<br/>Tags - <a href="http://anerg.com/tag.php?tag=mysql" rel="tag">mysql</a> , <a href="http://anerg.com/tag.php?tag=%25E5%2588%2586%25E8%25A1%25A8" rel="tag">分表</a>
]]>
</description>
</item><item>
<link>http://anerg.com/read.php?22</link>
<title><![CDATA[按时间，类别分组统计的SQL语句]]></title> 
<author>废墟 &lt;a@anerg.cn&gt;</author>
<category><![CDATA[数据库相关]]></category>
<pubDate>Tue, 28 Apr 2009 07:52:17 +0000</pubDate> 
<guid>http://anerg.com/read.php?22</guid> 
<description>
<![CDATA[ 
	<div class="quote"><div class="quote-title">引用</div><div class="quote-content">CREATE TABLE table1 ( <br />id int(11) NOT NULL auto_increment, <br />type varchar(2) default NULL, <br />date datetime default NULL, <br />PRIMARY KEY (id) ) <br />ENGINE=MyISAM DEFAULT CHARSET=gbk;<br /> INSERT INTO `table1 ` (`id`, `type`,`date`) VALUES <br />(1,'A', '2007-05-28 12:17:59'), <br />(2,'A', '2007-05-28 13:17:59'), <br />(3,'B', '2007-05-28 13:23:59'), <br />(4,'B', '2007-05-28 14:25:59'), <br />(5,'C', '2007-05-28 15:25:20'), <br />(6,'C', '2007-05-29 22:25:20'), <br />(7,'B', '2007-05-29 23:26:20'), <br />(8,'A', '2007-05-29 09:16:46'), <br />(9,'B', '2007-05-30 09:16:46'); <br />按照每天日期，然然后分组统计，按A分为一组， B,C分为一组分别进行统计统计结果如下 <br />date A B,C <br />2007-05-28 2 3 <br /> 2007-05-29 1 2&nbsp;&nbsp;<br />2009-05-30 0 1&nbsp;&nbsp;</div></div><br /><br />有这样一个需求，我给出的sql语句是<br /><div class="quote"><div class="quote-title">引用</div><div class="quote-content"><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord">SELECT</span> <span class="syntax_alpha syntax_alpha_functionName">DATE_FORMAT</span><span class="syntax_punct syntax_punct_bracket_open_round">(</span> <span class="syntax_alpha syntax_alpha_columnType">date</span><span class="syntax_punct syntax_punct_listsep">,</span>&nbsp;&nbsp;<span class="syntax_quote syntax_quote_double">&quot;%Y-%m-%d&quot;</span>&nbsp;&nbsp;<span class="syntax_punct syntax_punct_bracket_close_round">)</span>&nbsp;&nbsp;<span class="syntax_alpha syntax_alpha_reservedWord">AS</span> <span class="syntax_alpha syntax_alpha_identifier">date1</span><span class="syntax_punct syntax_punct_listsep">,</span> <span class="syntax_punct syntax_punct_bracket_open_round">(</span><div class="syntax_indent1"><br /><span class="syntax_alpha syntax_alpha_reservedWord">SELECT</span> <span class="syntax_alpha syntax_alpha_functionName">count</span><span class="syntax_punct syntax_punct_bracket_open_round">(</span> <span class="syntax_alpha syntax_alpha_identifier">id</span> <span class="syntax_punct syntax_punct_bracket_close_round">)</span> <br /><span class="syntax_alpha syntax_alpha_reservedWord">FROM</span> <span class="syntax_alpha syntax_alpha_identifier">table1</span><br /><span class="syntax_alpha syntax_alpha_reservedWord">WHERE</span>&nbsp;&nbsp;<span class="syntax_alpha syntax_alpha_reservedWord">TYPE</span>&nbsp;&nbsp;<span class="syntax_punct">=</span>&nbsp;&nbsp;<span class="syntax_quote syntax_quote_single">'A'</span><br /><span class="syntax_alpha syntax_alpha_reservedWord">AND</span> <span class="syntax_alpha syntax_alpha_functionName">DATE_FORMAT</span><span class="syntax_punct syntax_punct_bracket_open_round">(</span> <span class="syntax_alpha syntax_alpha_columnType">date</span><span class="syntax_punct syntax_punct_listsep">,</span>&nbsp;&nbsp;<span class="syntax_quote syntax_quote_double">&quot;%Y-%m-%d&quot;</span>&nbsp;&nbsp;<span class="syntax_punct syntax_punct_bracket_close_round">)</span>&nbsp;&nbsp;<span class="syntax_punct">=</span> <span class="syntax_alpha syntax_alpha_identifier">date1</span></div><span class="syntax_punct syntax_punct_bracket_close_round">)</span> <span class="syntax_alpha syntax_alpha_reservedWord">AS</span> <span class="syntax_alpha syntax_alpha_identifier">A</span><span class="syntax_punct syntax_punct_listsep">,</span> <span class="syntax_punct syntax_punct_bracket_open_round">(</span><div class="syntax_indent1"><br /><span class="syntax_alpha syntax_alpha_reservedWord">SELECT</span> <span class="syntax_alpha syntax_alpha_functionName">count</span><span class="syntax_punct syntax_punct_bracket_open_round">(</span> <span class="syntax_alpha syntax_alpha_identifier">id</span> <span class="syntax_punct syntax_punct_bracket_close_round">)</span> <br /><span class="syntax_alpha syntax_alpha_reservedWord">FROM</span> <span class="syntax_alpha syntax_alpha_identifier">table1</span><br /><span class="syntax_alpha syntax_alpha_reservedWord">WHERE</span> <span class="syntax_punct syntax_punct_bracket_open_round">(</span><div class="syntax_indent1"><br /><span class="syntax_alpha syntax_alpha_reservedWord">TYPE</span>&nbsp;&nbsp;<span class="syntax_punct">=</span>&nbsp;&nbsp;<span class="syntax_quote syntax_quote_single">'B'</span><br /><span class="syntax_alpha syntax_alpha_reservedWord">OR</span>&nbsp;&nbsp;<span class="syntax_alpha syntax_alpha_reservedWord">TYPE</span>&nbsp;&nbsp;<span class="syntax_punct">=</span>&nbsp;&nbsp;<span class="syntax_quote syntax_quote_single">'C'</span></div><span class="syntax_punct syntax_punct_bracket_close_round">)</span><br /><span class="syntax_alpha syntax_alpha_reservedWord">AND</span> <span class="syntax_alpha syntax_alpha_functionName">DATE_FORMAT</span><span class="syntax_punct syntax_punct_bracket_open_round">(</span> <span class="syntax_alpha syntax_alpha_columnType">date</span><span class="syntax_punct syntax_punct_listsep">,</span>&nbsp;&nbsp;<span class="syntax_quote syntax_quote_double">&quot;%Y-%m-%d&quot;</span>&nbsp;&nbsp;<span class="syntax_punct syntax_punct_bracket_close_round">)</span>&nbsp;&nbsp;<span class="syntax_punct">=</span> <span class="syntax_alpha syntax_alpha_identifier">date1</span></div><span class="syntax_punct syntax_punct_bracket_close_round">)</span> <span class="syntax_alpha syntax_alpha_reservedWord">AS</span> <span class="syntax_alpha syntax_alpha_identifier">BC</span><br /><span class="syntax_alpha syntax_alpha_reservedWord">FROM</span> <span class="syntax_alpha syntax_alpha_identifier">table1</span><br /><span class="syntax_alpha syntax_alpha_reservedWord">WHERE</span> <span class="syntax_alpha syntax_alpha_columnType">date</span><br /><span class="syntax_alpha syntax_alpha_reservedWord">IN</span> <span class="syntax_punct syntax_punct_bracket_open_round">(</span><div class="syntax_indent1"><br /><span class="syntax_alpha syntax_alpha_reservedWord">SELECT</span> <span class="syntax_alpha syntax_alpha_columnType">date</span><br /><span class="syntax_alpha syntax_alpha_reservedWord">FROM</span> <span class="syntax_alpha syntax_alpha_identifier">table1</span></div><span class="syntax_punct syntax_punct_bracket_close_round">)</span><br /><span class="syntax_alpha syntax_alpha_reservedWord">GROUP</span>&nbsp;&nbsp;<span class="syntax_alpha syntax_alpha_reservedWord">BY</span> <span class="syntax_alpha syntax_alpha_identifier">date1</span></span></div></div><br /><br />后来发现有更好的语句<br /><div class="quote"><div class="quote-title">引用</div><div class="quote-content"><span class="syntax"><span class="syntax_alpha syntax_alpha_reservedWord">SELECT</span> <span class="syntax_alpha syntax_alpha_functionName">DATE_FORMAT</span><span class="syntax_punct syntax_punct_bracket_open_round">(</span> <span class="syntax_alpha syntax_alpha_columnType">date</span><span class="syntax_punct syntax_punct_listsep">,</span>&nbsp;&nbsp;<span class="syntax_quote syntax_quote_single">'%Y-%m-%d'</span>&nbsp;&nbsp;<span class="syntax_punct syntax_punct_bracket_close_round">)</span> <span class="syntax_punct syntax_punct_listsep">,</span> <span class="syntax_alpha syntax_alpha_functionName">sum</span><span class="syntax_punct syntax_punct_bracket_open_round">(</span> <span class="syntax_alpha syntax_alpha_functionName">if</span><span class="syntax_punct syntax_punct_bracket_open_round">(</span> <br /><span class="syntax_alpha syntax_alpha_reservedWord">TYPE</span>&nbsp;&nbsp;<span class="syntax_punct">=</span>&nbsp;&nbsp;<span class="syntax_quote syntax_quote_single">'A'</span><span class="syntax_punct syntax_punct_listsep">,</span> <span class="syntax_digit syntax_digit_integer">1</span><span class="syntax_punct syntax_punct_listsep">,</span> <span class="syntax_digit syntax_digit_integer">0</span>&nbsp;&nbsp;<span class="syntax_punct syntax_punct_bracket_close_round">)</span>&nbsp;&nbsp;<span class="syntax_punct syntax_punct_bracket_close_round">)</span>&nbsp;&nbsp;<span class="syntax_alpha syntax_alpha_reservedWord">AS</span> <span class="syntax_alpha syntax_alpha_identifier">A</span><span class="syntax_punct syntax_punct_listsep">,</span> <span class="syntax_alpha syntax_alpha_functionName">sum</span><span class="syntax_punct syntax_punct_bracket_open_round">(</span> <span class="syntax_alpha syntax_alpha_functionName">if</span><span class="syntax_punct syntax_punct_bracket_open_round">(</span> <br /><span class="syntax_alpha syntax_alpha_reservedWord">TYPE</span>&nbsp;&nbsp;<span class="syntax_punct">=</span>&nbsp;&nbsp;<span class="syntax_quote syntax_quote_single">'B'</span><br /><span class="syntax_alpha syntax_alpha_reservedWord">OR</span>&nbsp;&nbsp;<span class="syntax_alpha syntax_alpha_reservedWord">TYPE</span>&nbsp;&nbsp;<span class="syntax_punct">=</span>&nbsp;&nbsp;<span class="syntax_quote syntax_quote_single">'C'</span><span class="syntax_punct syntax_punct_listsep">,</span> <span class="syntax_digit syntax_digit_integer">1</span><span class="syntax_punct syntax_punct_listsep">,</span> <span class="syntax_digit syntax_digit_integer">0</span>&nbsp;&nbsp;<span class="syntax_punct syntax_punct_bracket_close_round">)</span>&nbsp;&nbsp;<span class="syntax_punct syntax_punct_bracket_close_round">)</span>&nbsp;&nbsp;<span class="syntax_alpha syntax_alpha_reservedWord">AS</span> <span class="syntax_alpha syntax_alpha_identifier">BC</span><br /><span class="syntax_alpha syntax_alpha_reservedWord">FROM</span> <span class="syntax_alpha syntax_alpha_identifier">table1</span><br /><span class="syntax_alpha syntax_alpha_reservedWord">GROUP</span>&nbsp;&nbsp;<span class="syntax_alpha syntax_alpha_reservedWord">BY</span> <span class="syntax_alpha syntax_alpha_functionName">DATE_FORMAT</span><span class="syntax_punct syntax_punct_bracket_open_round">(</span> <span class="syntax_alpha syntax_alpha_columnType">date</span><span class="syntax_punct syntax_punct_listsep">,</span>&nbsp;&nbsp;<span class="syntax_quote syntax_quote_single">'%Y-%m-%d'</span>&nbsp;&nbsp;<span class="syntax_punct syntax_punct_bracket_close_round">)</span></span></div></div><br />
]]>
</description>
</item><item>
<link>http://anerg.com/read.php?21</link>
<title><![CDATA[Mysql的日期相关的东西]]></title> 
<author>废墟 &lt;a@anerg.cn&gt;</author>
<category><![CDATA[数据库相关]]></category>
<pubDate>Tue, 28 Apr 2009 07:44:01 +0000</pubDate> 
<guid>http://anerg.com/read.php?21</guid> 
<description>
<![CDATA[ 
	对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型。 <br /><br />这里是一个使用日期函数的例子。下面的查询选择了所有记录，其date_col的值是在最后30天以内： <br /><br />mysql&gt; SELECT something FROM table <br />WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) &lt;= 30; <br /><br />DAYOFWEEK(date) <br />返回日期date的星期索引(1=星期天，2=星期一, &hellip;&hellip;7=星期六)。这些索引值对应于ODBC标准。 <br />mysql&gt; select DAYOFWEEK('1998-02-03'); <br />-&gt; 3 <br /><br />WEEKDAY(date) <br />返回date的星期索引(0=星期一，1=星期二, &hellip;&hellip;6= 星期天)。 <br />mysql&gt; select WEEKDAY('1997-10-04 22:23:00'); <br />-&gt; 5 <br />mysql&gt; select WEEKDAY('1997-11-05'); <br />-&gt; 2 <br /><br />DAYOFMONTH(date) <br />返回date的月份中日期，在1到31范围内。 <br />mysql&gt; select DAYOFMONTH('1998-02-03'); <br />-&gt; 3 <br /><br />DAYOFYEAR(date) <br />返回date在一年中的日数, 在1到366范围内。 <br />mysql&gt; select DAYOFYEAR('1998-02-03'); <br />-&gt; 34 <br /><br />MONTH(date) <br />返回date的月份，范围1到12。 <br />mysql&gt; select MONTH('1998-02-03'); <br />-&gt; 2 <br /><br />DAYNAME(date) <br />返回date的星期名字。 <br />mysql&gt; select DAYNAME(&quot;1998-02-05&quot;); <br />-&gt; 'Thursday' <br /><br />MONTHNAME(date) <br />返回date的月份名字。 <br />mysql&gt; select MONTHNAME(&quot;1998-02-05&quot;); <br />-&gt; 'February' <br /><br />QUARTER(date) <br />返回date一年中的季度，范围1到4。 <br />mysql&gt; select QUARTER('98-04-01'); <br />-&gt; 2 <br /><br />WEEK(date) <br />　 <br />WEEK(date,first) <br />对于星期天是一周的第一天的地方，有一个单个参数，返回date的周数，范围在0到52。2个参数形式WEEK()允许<br />你指定星期是否开始于星期天或星期一。如果第二个参数是0，星期从星期天开始，如果第二个参数是1，<br />从星期一开始。 <br />mysql&gt; select WEEK('1998-02-20'); <br />-&gt; 7 <br />mysql&gt; select WEEK('1998-02-20',0); <br />-&gt; 7 <br />mysql&gt; select WEEK('1998-02-20',1); <br />-&gt; 8 <br /><br />YEAR(date) <br />返回date的年份，范围在1000到9999。 <br />mysql&gt; select YEAR('98-02-03'); <br />-&gt; 1998 <br /><br />HOUR(time) <br />返回time的小时，范围是0到23。 <br />mysql&gt; select HOUR('10:05:03'); <br />-&gt; 10 <br /><br />MINUTE(time) <br />返回time的分钟，范围是0到59。 <br />mysql&gt; select MINUTE('98-02-03 10:05:03'); <br />-&gt; 5 <br /><br />SECOND(time) <br />回来time的秒数，范围是0到59。 <br />mysql&gt; select SECOND('10:05:03'); <br />-&gt; 3 <br /><br />PERIOD_ADD(P,N) <br />增加N个月到阶段P（以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日期值。 <br />mysql&gt; select PERIOD_ADD(9801,2); <br />-&gt; 199803 <br /><br />PERIOD_DIFF(P1,P2) <br />返回在时期P1和P2之间月数，P1和P2应该以格式YYMM或YYYYMM。注意，时期参数P1和P2不是日期值。 <br />mysql&gt; select PERIOD_DIFF(9802,199703); <br />-&gt; 11 <br /><br />DATE_ADD(date,INTERVAL expr type) <br />　 <br />DATE_SUB(date,INTERVAL expr type) <br />　 <br />ADDDATE(date,INTERVAL expr type) <br />　 <br />SUBDATE(date,INTERVAL expr type) <br />这些功能执行日期运算。对于MySQL 3.22，他们是新的。ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同义词。<br />在MySQL 3.23中，你可以使用+和-而不是DATE_ADD()和DATE_SUB()。（见例子）date是一个指定开始日期的<br />DATETIME或DATE值，expr是指定加到开始日期或从开始日期减去的间隔值一个表达式，expr是一个字符串；它可以以<br />一个&ldquo;-&rdquo;开始表示负间隔。type是一个关键词，指明表达式应该如何被解释。EXTRACT(type FROM date)函数从日期<br />中返回&ldquo;type&rdquo;间隔。下表显示了type和expr参数怎样被关联： type值 含义 期望的expr格式 <br />SECOND 秒 SECONDS <br />MINUTE 分钟 MINUTES <br />HOUR 时间 HOURS <br />DAY 天 DAYS <br />MONTH 月 MONTHS <br />YEAR 年 YEARS <br />MINUTE_SECOND 分钟和秒 &quot;MINUTES:SECONDS&quot; <br />HOUR_MINUTE 小时和分钟 &quot;HOURS:MINUTES&quot; <br />DAY_HOUR 天和小时 &quot;DAYS HOURS&quot; <br />YEAR_MONTH 年和月 &quot;YEARS-MONTHS&quot; <br />HOUR_SECOND 小时, 分钟， &quot;HOURS:MINUTES:SECONDS&quot; <br />DAY_MINUTE 天, 小时, 分钟 &quot;DAYS HOURS:MINUTES&quot; <br />DAY_SECOND 天, 小时, 分钟, 秒 &quot;DAYS HOURS:MINUTES:SECONDS&quot; <br /><br />MySQL在expr格式中允许任何标点分隔符。表示显示的是建议的分隔符。如果date参数是一个DATE值并且你的计算仅仅<br />包含YEAR、MONTH和DAY部分(即，没有时间部分)，结果是一个DATE值。否则结果是一个DATETIME值。 <br /><br />mysql&gt; SELECT &quot;1997-12-31 23:59:59&quot; + INTERVAL 1 SECOND; <br />-&gt; 1998-01-01 00:00:00 <br />mysql&gt; SELECT INTERVAL 1 DAY + &quot;1997-12-31&quot;; <br />-&gt; 1998-01-01 <br />mysql&gt; SELECT &quot;1998-01-01&quot; - INTERVAL 1 SECOND; <br />-&gt; 1997-12-31 23:59:59 <br />mysql&gt; SELECT DATE_ADD(&quot;1997-12-31 23:59:59&quot;, <br />INTERVAL 1 SECOND); <br />-&gt; 1998-01-01 00:00:00 <br />mysql&gt; SELECT DATE_ADD(&quot;1997-12-31 23:59:59&quot;, <br />INTERVAL 1 DAY); <br />-&gt; 1998-01-01 23:59:59 <br />mysql&gt; SELECT DATE_ADD(&quot;1997-12-31 23:59:59&quot;, <br />INTERVAL &quot;1:1&quot; MINUTE_SECOND); <br />-&gt; 1998-01-01 00:01:00 <br />mysql&gt; SELECT DATE_SUB(&quot;1998-01-01 00:00:00&quot;, <br />INTERVAL &quot;1 1:1:1&quot; DAY_SECOND); <br />-&gt; 1997-12-30 22:58:59 <br />mysql&gt; SELECT DATE_ADD(&quot;1998-01-01 00:00:00&quot;, <br />INTERVAL &quot;-1 10&quot; DAY_HOUR); <br />-&gt; 1997-12-30 14:00:00 <br />mysql&gt; SELECT DATE_SUB(&quot;1998-01-02&quot;, INTERVAL 31 DAY); <br />-&gt; 1997-12-02 <br />mysql&gt; SELECT EXTRACT(YEAR FROM &quot;1999-07-02&quot;); <br />-&gt; 1999 <br />mysql&gt; SELECT EXTRACT(YEAR_MONTH FROM &quot;1999-07-02 01:02:03&quot;); <br />-&gt; 199907 <br />mysql&gt; SELECT EXTRACT(DAY_MINUTE FROM &quot;1999-07-02 01:02:03&quot;); <br />-&gt; 20102 <br /><br />如果你指定太短的间隔值(不包括type关键词期望的间隔部分)，MySQL假设你省掉了间隔值的最左面部分。例如，<br />如果你指定一个type是DAY_SECOND，值expr被希望有天、小时、分钟和秒部分。如果你象&quot;1:10&quot;这样指定值，<br />MySQL假设日子和小时部分是丢失的并且值代表分钟和秒。换句话说，&quot;1:10&quot; DAY_SECOND以它等价于&quot;1:10&quot; MINUTE_SECOND<br />的方式解释，这对那MySQL解释TIME值表示经过的时间而非作为一天的时间的方式有二义性。如果你使用确实不正确的日期，<br />结果是NULL。如果你增加MONTH、YEAR_MONTH或YEAR并且结果日期大于新月份的最大值天数，日子在新月用最大的天调整。 <br /><br />mysql&gt; select DATE_ADD('1998-01-30', Interval 1 month); <br />-&gt; 1998-02-28 <br /><br />注意，从前面的例子中词INTERVAL和type关键词不是区分大小写的。 <br />TO_DAYS(date) <br />给出一个日期date，返回一个天数(从0年的天数)。 <br />mysql&gt; select TO_DAYS(950501); <br />-&gt; 728779 <br />mysql&gt; select TO_DAYS('1997-10-07'); <br />-&gt; 729669 <br /><br />TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。 <br /><br />FROM_DAYS(N) <br />给出一个天数N，返回一个DATE值。 <br />mysql&gt; select FROM_DAYS(729669); <br />-&gt; '1997-10-07' <br /><br />TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。 <br /><br />DATE_FORMAT(date,format) <br />根据format字符串格式化date值。下列修饰符可以被用在format字符串中： %M 月名字(January&hellip;&hellip;December) <br />%W 星期名字(Sunday&hellip;&hellip;Saturday) <br />%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。） <br />%Y 年, 数字, 4 位 <br />%y 年, 数字, 2 位 <br />%a 缩写的星期名字(Sun&hellip;&hellip;Sat) <br />%d 月份中的天数, 数字(00&hellip;&hellip;31) <br />%e 月份中的天数, 数字(0&hellip;&hellip;31) <br />%m 月, 数字(01&hellip;&hellip;12) <br />%c 月, 数字(1&hellip;&hellip;12) <br />%b 缩写的月份名字(Jan&hellip;&hellip;Dec) <br />%j 一年中的天数(001&hellip;&hellip;366) <br />%H 小时(00&hellip;&hellip;23) <br />%k 小时(0&hellip;&hellip;23) <br />%h 小时(01&hellip;&hellip;12) <br />%I 小时(01&hellip;&hellip;12) <br />%l 小时(1&hellip;&hellip;12) <br />%i 分钟, 数字(00&hellip;&hellip;59) <br />%r 时间,12 小时(hh:mm:ss [AP]M) <br />%T 时间,24 小时(hh:mm:ss) <br />%S 秒(00&hellip;&hellip;59) <br />%s 秒(00&hellip;&hellip;59) <br />%p AM或PM <br />%w 一个星期中的天数(0=Sunday &hellip;&hellip;6=Saturday ） <br />%U 星期(0&hellip;&hellip;52), 这里星期天是星期的第一天 <br />%u 星期(0&hellip;&hellip;52), 这里星期一是星期的第一天 <br />%% 一个文字&ldquo;%&rdquo;。 <br /><br />所有的其他字符不做解释被复制到结果中。 <br /><br />mysql&gt; select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y'); <br />-&gt; 'Saturday October 1997' <br />mysql&gt; select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s'); <br />-&gt; '22:23:00' <br />mysql&gt; select DATE_FORMAT('1997-10-04 22:23:00', <br />'%D %y %a %d %m %b %j'); <br />-&gt; '4th 97 Sat 04 10 Oct 277' <br />mysql&gt; select DATE_FORMAT('1997-10-04 22:23:00', <br />'%H %k %I %r %T %S %w'); <br />-&gt; '22 22 10 10:23:00 PM 22:23:00 00 6' <br />MySQL3.23中，在格式修饰符字符前需要%。在MySQL更早的版本中，%是可选的。 <br /><br />TIME_FORMAT(time,format) <br />这象上面的DATE_FORMAT()函数一样使用，但是format字符串只能包含处理小时、分钟和秒的那些格式修饰符。<br />其他修饰符产生一个NULL值或0。 <br />CURDATE() <br />　 <br />CURRENT_DATE <br />以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值，取决于函数是在一个字符串还是数字上下文被使用。 <br />mysql&gt; select CURDATE(); <br />-&gt; '1997-12-15' <br />mysql&gt; select CURDATE() + 0; <br />-&gt; 19971215 <br /><br />CURTIME() <br />　 <br />CURRENT_TIME <br />以'HH:MM:SS'或HHMMSS格式返回当前时间值，取决于函数是在一个字符串还是在数字的上下文被使用。 <br />mysql&gt; select CURTIME(); <br />-&gt; '23:50:26' <br />mysql&gt; select CURTIME() + 0; <br />-&gt; 235026 <br /><br />NOW() <br />　 <br />SYSDATE() <br />　 <br />CURRENT_TIMESTAMP <br />以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的日期和时间，取决于函数是在一个字符串还是在数字的<br />上下文被使用。 <br />mysql&gt; select NOW(); <br />-&gt; '1997-12-15 23:50:26' <br />mysql&gt; select NOW() + 0; <br />-&gt; 19971215235026 <br /><br />UNIX_TIMESTAMP() <br />　 <br />UNIX_TIMESTAMP(date) <br />如果没有参数调用，返回一个Unix时间戳记(从'1970-01-01 00:00:00'GMT开始的秒数)。如果UNIX_TIMESTAMP()用一<br />个date参数被调用，它返回从'1970-01-01 00:00:00' GMT开始的秒数值。date可以是一个DATE字符串、一个DATETIME<br />字符串、一个TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地时间的一个数字。 <br />mysql&gt; select UNIX_TIMESTAMP(); <br />-&gt; 882226357 <br />mysql&gt; select UNIX_TIMESTAMP('1997-10-04 22:23:00'); <br />-&gt; 875996580 <br /><br />当UNIX_TIMESTAMP被用于一个TIMESTAMP列，函数将直接接受值，没有隐含的&ldquo;string-to-unix-timestamp&rdquo;变换。 <br /><br />FROM_UNIXTIME(unix_timestamp) <br />以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值，取决于函数是在一个字符串<br />还是或数字上下文中被使用。 <br />mysql&gt; select FROM_UNIXTIME(875996580); <br />-&gt; '1997-10-04 22:23:00' <br />mysql&gt; select FROM_UNIXTIME(875996580) + 0; <br />-&gt; 19971004222300 <br /><br />FROM_UNIXTIME(unix_timestamp,format) <br />返回表示 Unix 时间标记的一个字符串，根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条<br />目同样的修饰符。 <br />mysql&gt; select FROM_UNIXTIME(UNIX_TIMESTAMP(), <br />'%Y %D %M %h:%i:%s %x'); <br />-&gt; '1997 23rd December 03:43:30 x' <br /><br />SEC_TO_TIME(seconds) <br />返回seconds参数，变换成小时、分钟和秒，值以'HH:MM:SS'或HHMMSS格式化，取决于函数是在一个字符串还是在数字<br />上下文中被使用。 <br />mysql&gt; select SEC_TO_TIME(2378); <br />-&gt; '00:39:38' <br />mysql&gt; select SEC_TO_TIME(2378) + 0; <br />-&gt; 3938 <br /><br />TIME_TO_SEC(time) <br />返回time参数，转换成秒。 <br />mysql&gt; select TIME_TO_SEC('22:23:00'); <br />-&gt; 80580 <br />mysql&gt; select TIME_TO_SEC('00:39:38'); <br />-&gt; 2378 <br />
]]>
</description>
</item><item>
<link>http://anerg.com/read.php?10</link>
<title><![CDATA[用SQL存储过程实现SAP B1的序列号自动添加]]></title> 
<author>anerg &lt;r.anerg@gmail.com&gt;</author>
<category><![CDATA[数据库相关]]></category>
<pubDate>Tue, 02 Dec 2008 08:44:30 +0000</pubDate> 
<guid>http://anerg.com/read.php?10</guid> 
<description>
<![CDATA[ 
	这是大约半年前写在QQ空间里的，现在转过来吧<br/><br/>SAP Business One的序列号添加实在是太恶心了，难用又麻烦，不知道为啥，我们公司这个实施顾问一口咬定b1不能做序列号自动添加的功能，我算是服了，求人不如求己，自己来呗。东找找，西找找，这个问问，那个问问，终于还是有点收获，今天又头痛的厉害，昏睡一天，下午起来，突然有了灵感，大概知道怎么做了，于是乎动手，写，调试，5点半下班的时候搞出来了。下楼去跟使用的人说了，结果人先给我来了一句，“怎么别人下班的时候你才上班啊？”晕一个。。。<br/><br/>恩，把东西记录在这里，没准有人看见了会有需要呢。。<br/><br/>格式化查询语句：<br/><div class="code">execute UtmpGetSNArr $&#91;$43.5.1&#93; ,$&#91;$43.37.69&#93;</div><br/><br/> <br/>存储过程：<br/><div class="code">set ANSI_NULLS ON<br/>set QUOTED_IDENTIFIER ON<br/>go<br/><br/>create PROCEDURE &#91;dbo&#93;.&#91;UtmpGetSNArr&#93; <br/>@tItemCode nvarchar(30),<br/>@tNums int<br/>AS<br/>BEGIN<br/>declare @tmpTable table (col1 varchar(40))<br/>declare @tSN as nvarchar(50)<br/>declare @fSN as nvarchar(50)<br/>declare @str as nvarchar(10)<br/>declare @tDate as nvarchar(50)<br/>declare @tcount int<br/>declare @i int<br/><br/>Select @tDate=LEFT(Convert(varchar(20),getdate(),12),4)<br/>set @tSN=rtrim(@tItemCode)+rtrim(@tDate)<br/>if exists(<br/>&nbsp;&nbsp;select IntrSerial from OSRI where IntrSerial LIKE @tSN+&#039;____&#039;<br/>)<br/>begin<br/>&nbsp;&nbsp;declare @tmp as nvarchar(20)<br/>&nbsp;&nbsp;select @tmp=right(max(IntrSerial),4)+1 from OSRI where IntrSerial LIKE @tSN+&#039;____&#039;<br/>&nbsp;&nbsp;set @str =right(&#039;0000&#039;+rtrim(cast(@tmp&nbsp;&nbsp; as&nbsp;&nbsp; char)),&nbsp;&nbsp; 4)<br/>end<br/>ELSE<br/>&nbsp;&nbsp;set @str=&#039;0001&#039; <br/><br/>if(@tNums=1)<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp; set @fSN=rtrim(@tSN)+rtrim(@str)<br/>&nbsp;&nbsp; select @fSN<br/>&nbsp;&nbsp;end<br/>ELSE<br/>&nbsp;&nbsp;set @i=0<br/>&nbsp;&nbsp;while @i&lt;@tNums<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp; set @str =right(&#039;0000&#039;+rtrim(cast(@str as char)), 4)<br/>&nbsp;&nbsp; set @fSN=rtrim(@tSN)+rtrim(@str)&nbsp;&nbsp; <br/>&nbsp;&nbsp; INSERT&nbsp;&nbsp; INTO&nbsp;&nbsp; @tmpTable&nbsp;&nbsp; VALUES(@fSN)<br/>&nbsp;&nbsp; set @i=@i+1<br/>&nbsp;&nbsp; set @str=@str+1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;end<br/>select col1 from @tmpTable<br/><br/>END<br/></div><br/><br/><a href="http://anerg.com/attachment.php?fid=9" target="_blank"><img src="http://anerg.com/attachment.php?fid=9" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>在鼠标所在地方添加格式化搜索即可。<br/><br/>我这里序列号的规则是物料编号+4位年月+4位流水号，如果有其他的需求，修改那个存储过程即可。<br/><br/>自己还是比较满意的，最近学了不少东西，很有意思。不过我很不明白的就是，为什么很多人都喜欢私藏，其实这些代码并不难，怎么就有人总是不愿意给人分享，也不愿意告诉别人方法呢，这里我还得特别感谢群里的一个朋友，也是他开始给我的一些思路，才能完成这个东西。
]]>
</description>
</item>
</channel>
</rss>