愿天天向上,愿学以致用,愿掌握生活

发布新日志

  • 盼望着毕业 做了一个倒计时 见笑了

    2007-11-14 17:56:09

    <scrīpt language="javascrīpt">

    var future = new Date(2008, 1, 1);

    function cal()
    {
    var now = new Date();

    var day = now.toLocaleDateString();
    var time = now.toLocaleTimeString();

    document.f1.text1.value = day;
    document.f1.text2.value = time;

    //86400000 = 24*60*60*1000
    //3600000 = 60*60*1000
    //60000 = 60*1000

    var d = future - now;
    var dday = d / (86400000);
    var dhour = (d - Math.floor(dday)*86400000) / (3600000);
    var dminute = (d - Math.floor(dday)*86400000 - Math.floor(dhour)*3600000) / (60000);
    var dsecond = (d - Math.floor(dday)*86400000 - Math.floor(dhour)*3600000 - Math.floor(dminute)*60000) / (1000);

    document.f1.text3.value = Math.floor(dday) + '天' + Math.floor(dhour) + '时' + Math.floor(dminute) + '分' + Math.ceil(dsecond) + '秒';

    setTimeout("cal();",1000)
    }
    </scrīpt>

    <BODY ōnload="cal();">
    <form name="f1">
    今天是:<input type="text" name="text1" value="">
    现在时间:<input type="text" name="text2" value="">
    <br>
    <br>
    2008年1月31日,毕业的日子<br>
    <br>
    距离那一天还有:<input type="text" name="text3" value="">
    </form>
    </BODY>

  • counterV1.0的SRS评审

    2007-11-07 16:24:16

    一个小小的Counter,一个大大的SRS.
    所谓麻雀虽小,五脏俱全.小东西却反映出大道理.
    鉴于Counter是内部培训资料的缘故,我不便多说关于SRS的内容.
    但有一点要说的是:眼光很重要.
    一个产品要有竞争力,亮点在哪里?在你的思想里,在于别人没有,而你却有的那份思想.
    就像周润发的一句广告语:成功?我才刚起步呢.
    更何况,我们还有没感受过成功呢.
    Keep on hard working.

  • javascript (continue and do/while)

    2007-10-31 16:46:06

        执行continue语句时,封闭循环的当前迭代就会被终止,开始执行下一次迭代.这对不同类型的循环语句含义是不同的:
        (1)在while循环中,会再次检测循环开头的expression,如果它的值为true,将从头开始执行循环体.
        (2)在do/while循环中,会跳到循环的底部,在顶部开始下次循环前,会在此先检测循环条件.但是,在Javascrīpt 1.2中有一个bug,它使continue语句直接跳转到do/while语句的顶部,而无需检测循环条件.因此,如果你打算在循环中使用continue语句,就应该避免使用do/while循环,除非你可以确定自己用户的浏览器绝对没有bug.但是这个问题并不严重,因为总有一个等价的while循环可以用来替换do/while循环.
        (3)在for循环中,先计算increment表达式,然后再检测test表达式以确定是否应该执行下一次迭代.
        (4)在for/in循环中,将以下一个赋给循环变量的属性名再次开始新的迭代.

  • javascript (break and lable)

    2007-10-31 16:31:27

    <scrīpt language="javascrīpt">

    outerloop:
      for(var i = 0; i < 10; i++) {
        innerloop:
          for(var j = 0; j < 10; j++) {
              if (j > 3) break;             // Quit the innermost loop
              if (i == 2) break innerloop;  // Do the same thing
              if (i == 4) break outerloop;  // Quit the outer loop
              document.write("i = " + i + " j = " + j + "<br>");
          }
      }
      document.write("FINAL i = " + i + " j = " + j + "<br>");

    </scrīpt>

    不带lable的break:退出所在循环的最内层循环
    带lable的break:退出循环至lable处

    如上代码结果为:
    i = 0 j = 0
    i = 0 j = 1
    i = 0 j = 2
    i = 0 j = 3
    i = 1 j = 0
    i = 1 j = 1
    i = 1 j = 2
    i = 1 j = 3
    i = 3 j = 0
    i = 3 j = 1
    i = 3 j = 2
    i = 3 j = 3
    FINAL i = 4 j = 0

  • javascript (for/in)

    2007-10-31 16:09:37

        for(variable in object)
            statement;
        for/in语句提供了一种遍历对象属性的方法.for/in循环的主体对object的每个属性执行一次.在循环体执行之前,对象的一个属性名会被作为字符串赋给变量variable.在循环体内部,可以使用这个变量和"[ ]"运算符来查询该对象属性的值.
        for/in循环中的varialbe可以是任意的表达式,只要它的值适用于赋值表达式的左边即可.每一次循环都会计算表达式的值,这意味每次计算的值都会不同.即,可以把一个对象的所有属性名复制到一个数组中.

        结合上述两点,有如下程序.
    <scrīpt language="javascrīpt">

    var p ={x:1, y:2, z:3};
    var pp;
    for (pp in p)
        {document.write(pp+" value is :"+p[pp]+"<br>");}

    var o ={x:4, y:5, z:6};
    var a =new Array();
    var i = 0;
    for (a[i++] in o)
        {document.write(a[i-1]+" value is :"+o[a[i-1]]+"<br>");}

    </scrīpt>

    即使循环体只有一个语句,加上{}是一个好的习惯.

  • javascript (prompt)

    2007-10-31 15:11:44

        UBB中经常用到window.prompt()方法,来进行一些参数的接受,比如很常见的获取URL和EMAIL等等,那么prompt到底是怎么进行值的传递的呢,下面结合示例进行解释.

        首先:
        window.prompt有两个参数和一个返回值,   
        第一个参数,显示提示输入框的信息.   
        第二个参数,用于显示输入框的默认值.   
        返回,用户输入的值.   

    pro.htm
    <input type="button" ōnclick="javascrīpt:pro()">
    <scrīpt language="javascrīpt"> 
     
         function pro() 
         { 
             var tempA=window.prompt('请输入你的姓名',''); 
             if( tempA=="" || tempA==null ) 
             { 
                 tempA="你没有输入任何文字"; 
             } 
             alert(tempA); 
         } 
     
    </scrīpt>

    点击按钮,则弹出提示框,等待输入(不能取消).
    若输入信息,则alert出一个新提示框,显示输入信息
    若没有输入信息,则alert出一个新提示框,显示"你没有输入任何文字"

  • javascript (基本类型与引用类型)

    2007-10-29 17:05:42

    var a = 3.14;  //Declare and initialize avariable
    var b = a;     //Copy the variable's value to a new variable
    a = 4;         //Modify the value of the original variable
    alert(b);      //Displays 3.14,the copy has not changed

    这段代码没有什么惊人这处,但对这段代码做轻微的发动,使用数组(一个引用类型)代替数值,情况会发生变化:

    var a = [1,2,3];  //Initialize a variable to refer to an array
    var b = a;        //Copy that reference into a new variable
    a[0] = 99;        //Modify the array using the original reference
    alert (b);        //Display the changed array [99,2,3] using the new reference

    在这个语句中,赋给b的只是对数组值的一个引用,而不是数组本身,数组已经在语句中被赋值了.执行过第二行代码之后,我们仍旧只有一个数组对象,只不过我们有了两个对它的引用.

  • javascript (无块级作用域)

    2007-10-29 16:35:39

    var scope = "global";
    function f() {
        alert(scope);         //Displays "undefined",not "global"
        var scope = "local";  
        alert(scope);         //Displays "local"
    }
    f();

    你可能认为对alert()的第一次调用会显示出"global",因为声明局部变量的var语句还没有执行而调用全局变量scope.但是,由于"无块级作用域"的限制,输出的并不是"global".局部变量在整个函数体内是有定义的,这就意味着在整个函数体中都隐藏了同名的全局变量.虽然局部变量在整个函数体是都是有定义的,但是在执行var语句之前,它是不会被初始化的.即,上面的f()与下面的f1()等价:

    var scope = "global";
    function f1() {
        var scope;
        alert(scope);
        scope = "local";
        alert("scope");
    }
    f1();

  • javascript (function)

    2007-10-29 15:21:19

    Javascrīpt的一个重要性是Javascrīpt代码可以对函数进行操作.

    在许多语言中(包括Java),函数都只是语言的语法特性,它们可以被定义,被调用,但却不是数据类型.Javascrīpt中的函数是一个真正的数据类型,这一点给语言带来了很大的灵活性.这就意味着函数可以被存储在变量,数组和对象中,而且函数还可以作为参数传递给其他函数,这是非常有用的.

    由于函数是和数字,字符串一样的数据类型,因此它也可以像其他类型的值一样被赋给对象的属性.一个函数被赋给某个对象的属性时,它常常被当作那个对象的方法来引用.

    (1)
    function square(x) { return x*x; }

    (2)
    var square=function(x) { return x*x; }

    (3)
    var square = new Function("x", "return x*x;");

  • javascript (toString)

    2007-10-28 16:31:49

    <scrīpt type="text/javascrīpt">

    var y = (255).toString(16);
    document.write(y);

    </scrīpt>

    y被转换为16进制,值为ff

    也可以这么写更加直观:var y=(255).toString(0x10)

  • 数组定义

    2007-10-19 14:36:36

    数组定义由类型名,标识符和维数组成.维数指定数组中包含的元素的数目,它被写在一对方括号里边.我们必须为数组指定一个大于等于1 的维数.维数值必须是常量表达式——即,必须能在编译时刻计算出它的值.这意味着非const 的变量不能被用来指定数组的维数.
    下面的例子包含合法的和非法的数组定义:

    extern int get_size();
    // buf_size 和max_files 都是const
    const int buf_size = 512, max_files = 20;
    int staff_size = 27;
    // ok: const 变量
    char input_buffer[ buf_size ];
    // ok 常量表达式: 20 - 3
    char *fileTable[ max_files - 3 ];
    // 错误: 非const 变量
    double salaries[ staff_size ];
    // 错误非const 表达式
    int test_scores[ get_size() ];

    虽然staff_size 被一个文字常量初始化,但是staff_size 本身是一个非const 对象,系统只能在运行时刻访问它的值,因此它作为数组维数是非法的.

    但是用户必须清楚,C++没有提供编译时刻或运行时刻对数组下标的范围检查.除了程序员自己注意细节,并彻底地测试自己的程序之外,没有别的办法可防止数组越界.能够通过编译并执行的程序仍然存在致命的错误,这不是不可能的.

  • const与指针

    2007-10-17 18:15:51

       使用const修饰指针时,由于const的位置不同,而含意不同。下面举两个例子,说明它们的区别。

      下面定义的一个指向字符串的常量指针:

      char * const prt1 = stringprt1;

      其中,ptr1是一个常量指针。因此,下面赋值是非法的。

      ptr1 = stringprt2;

      而下面的赋值是合法的:

      *ptr1 = "m";

      因为指针ptr1所指向的变量是可以更新的,不可更新的是常量指针ptr1所指的方向(别的字符串)。

      下面定义了一个指向字符串常量的指针:

      const * ptr2 = stringprt1;

      其中,ptr2是一个指向字符串常量的指针。ptr2所指向的字符串不能更新的,而ptr2是可以更新的。因此,

      *ptr2 = "x";

      是非法的,而:

      ptr2 = stringptr2;

      是合法的。

      所以,在使用const修饰指针时,应该注意const的位置。定义一个指向字符串的指针常量和定义一个指向字符串常量的指针时,const修饰符的位置不同,前者const放在*和指针名之间,后者const放在类型说明符前。
  • 对象声明

    2007-10-17 16:12:37

    // file module0.C
    // 定义fileName 对象
    string fileName;
    // ... 为fileName 赋一个值


    // file module1.C
    // 需要使用 fileName 对象
    // 喔: 编译失败:
    // 在module1.C 中fileName 未定义
    ifstream input_file( fileName );

    在C++中,程序在使用对象之前必须先知道该对象.这对"编译器保证对象在使用时的类型正确性"是必需的.引用一个未知的对象将引起编译错误.在本例中,由于在model1.C中没有定义fileName,所以该文件编译失败.
    要编译model1.C,必须让程序知道fileName.

    要编译model1.C,必须让程序知道fileName,但又不能引入第二个定义.我们可以通过声明(declaring)该变量来做到这一点.
    // file module1.C
    // 需经使用fileName 对象
    // 声明fileName, 也即, 让程序知道它,
    // 但又不引入第二个定义
    extern string fileName;
    ifstream input_file( fileName );
    对象声明(declaration)的作用是使程序知道该对象的类型和名字.它由关键字extern以及跟在后面的对象类型以及对象的名字构成.声明不是定义,不会引起内存分配.实际上,它只是说明了在程序之外的某处有这个变量的定义.

    虽然一个程序只能包含一个对象的一个定义,但它可以包含任意数目的对象声明.比较好的做法,不是在每个使用对象的文件中都提供一个单独的声明而,是在一个头文件中声明这个对象,然后再在需要声明该对象的时候包含这个头文件.按照这种做法,如果需要修改对象的声明,则只需要修改一次就能维持多个使用该对象的文件中声明的一致性.

  • 幂函数pow

    2007-10-17 15:57:37

    假设有这样一个问题:计算2 的10 次方.我们首先想到的可能是
    #include <iostream>
    int main() {
    // 第一个解决方案
    cout << "2 raised to the power of 10: ";
    cout << 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2;
    cout << endl;
    return 0;
    }
    这样确实能够解决问题,但是可能需要检查两到三遍以确保正好有10个常数2参与乘法.

    接着我们被要求算出2的17次方和2的23次方.每次都要修改程序确实很麻烦,但更糟糕的是,这样做经常会出错.修改后的程序常常会多乘或少乘了一个2.最后我们又被要求生成2的从0到15次方的数值的表.使用文字常量需要与32行类似下面的格式
    cout << "2 raised to the power of X\t";
    cout << 2 * ... * 2;
    这里X随每对语句递增1.
    虽然这种蛮力型的方案也能解决问题,但是它总让人感到不快而且有些危机感.

    在下例中用来取代这种蛮力型的方案包括两部分内容:使用有名字的对象来读写每步的计算;引入一个控制流结构以便在某个条件为真时可以重复执行一系列语句.
    下面是一种技术先进的计算2 的10 次幂的程序:
    #include <iostream.h>
    int main()
    {
    // int 类型的对象
    int value = 2;
    int pow = 10;
    cout << value << " raised to the power of "
    << pow << ": \t";
    int res = 1; // 保存结果
    // 循环控制语句: 反复计算res
    // 直至cnt 大于pow
    for ( int cnt=1; cnt <= pow; ++cnt)
    res = res * value;
    cout << res << endl;
    }
    value,pow,res以及cnt是变量.它们允许对数值进行存储修改和查询.for循环使计算过程重复执行pow次.虽然这种层次的通用化能使程序更加灵活,但是这样的程序仍然是不可重用的.

    我们必须进一步通用化:把计算指数值的那部分程序代码抽取出来,定义成一个独立的函数以使其他函数能够凋用它.例如:
    int pow( int val, int exp )
    {
    for ( int res = 1; exp > u; --exp )
    res = res * val;
    return res;
    }
    现在每个需要计算指数值的程序,都可以使用pow()的实例,而不是重新实现它

    我们可以用如下的代码来生成2的幂的表:
    #include <iostream>
    extern int pow(int, int);
    int main()
    {
    int val = 2;
    int exp = 15;
    cout << "The Powers of 2\n";
    for ( int cnt=0; cnt <= exp; ++cnt )
    cout << cnt << ": "
    << pow(val, cnt) << endl;
    return 0;
    }
    实际上,这个pow()的实现既不够健壮也不够通用.例如,如果指数是负数该怎么办,如果是1 000 000 呢,对于负数指数,我们的程序总是返回1.对于一个非常大的指数,变量int res又小得不能够容纳这个结果.因此,对于一个大的指数将返回一个任意的不正确的值(在这种情况下,最好的解决方案是将返回值的类型修改为double类型)从通用的角度来说,我们的程序应该能够处理整数和浮点数类型的底数和指数,甚至其他的类型.正如你所看到的,为一个未知的用户组写一个健壮的通用函数,比实现一个特定的算法来解决眼前的问题要复杂得多.

  • 一只盐罐

    2007-10-17 13:13:54

    作者:王悦 转自:特别关注28期

        汽车奔驰了一个多小时后,我才发现错过了高速公路出口.天色渐晚,我只好从最近的出口下了高速公路,住进路边一个家庭旅馆,准备第二天天亮后再绕道回布朗镇.
        坐在餐桌前,我心事重重地翻弄着盘子里的青豆.
        这是一家老式旅馆,窄小的餐厅里只有一张长条餐桌,所有就餐的客人都坐在一起,早已习惯拥有私人空间的我,现在要和一群陌生人同桌吃饭,突然觉得不知所措.环视周围,别人也和我一样不自在,不是盯着自己的杯盘,就是装着看过期的报纸,怕稍一斜视,便有窥探他人隐私之嫌.我们对吃饭的动作很注意,不敢冒犯别人的"空间".我的晚餐时间,要在这么沉闷的气氛中度过吗?
        我拿起放在面前的盐罐--餐桌上唯一的盐罐,递给右边的女士,"我觉得青豆有些淡,您或者您右边的客人需要盐吗?"我微笑着说.她愣了一下,但马上露出笑容,向我轻声道谢.
        给自己的青豆加完盐后,她把盐罐传给了下一个客人.不知什么时候,胡椒罐和粮罐也加入了"公关"行列,餐厅里的气氛渐渐活跃起来.饭还没吃完,全桌人已经像朋友一样谈笑风生.我们中间的冰层,被一只盐罐轻而易举地打破.
        第二天分手的时候,我们热情地互相道别.突然,有一个人大声地说:"其实,昨天的青豆一点也不淡."我们会心地哈哈大笑.
        有人曾慨叹,人与人之间的隔膜太厚,这隔膜其实很脆弱,问题是敢于先打破它的人太少.只要每人都迈出一小步,你就会发现,一个微笑,一只盐罐就能打破它.

     

  • 常用C语言类单元测试工具介绍

    2007-10-15 11:24:18

    1.VcTester
      a.简介
        VcTester是与VC(注:Visual C++及Visual Studio开发套件是微软发布的产品)配套使用的新一代单元测试工具,分共享版与商用版两大系列,其主要功能包括:脚本化测试驱动(包括修改变量与调用函数),脚本桩,支持持续集成测试,测试覆盖率统计(仅商用版本),生成测试报告(仅商用版本),测试消息编辑器(仅商用版本)等.
      b.功能特性
        脚本化测试驱动
        脚本桩
        在线测试
        即时调测
        测试工程管理
      c.相关网站
        www.ezTester.com

    2.C++Test
      a.简介
        C++Test是一个功能强大的自动化C/C++单元级测试工具,可以自动测试任何C/C++函数,类,自动生成测试用例,测试驱动函数或桩函数,在自动化的环境下极其容易快速的将单元级的测试覆盖率达到100%.
      b.功能特性
        即时测试类/函数
        支持极端编程模式下的代码测试
        自动建立类/函数的测试驱动程序和桩调用
        自动建立和执行类/函数的测试用例
        执行自动回归测试
        执行部件测试(COM)
      c.相关网站
        www.parasoft.com

  • 特定的用例测试设计

    2007-10-15 11:09:33

    1.声明测试:检查模块中的所有变量是否被声明.经验表明,大量重要的错误都是由于变量没有被声明或没有被正确的声明而引起的.(而C语言中,指针未被初始化或未被正确初始化也是严重的问题)

    2.路径测试:属逻辑覆盖测试.由于实际中,一个模块中的路径可能非常多,因为时间和资源有限,不可能一一测到.这就需要把测试所有可能路径的目标减少到测试足够多的路径,以获得对模块的信心.要测试的最小路径集就是基本测试路径集.

    3.循环测试:重点检查循环的条件-判断部分以及边界条件.测试循环的一种特殊的路径测试,因为循环比其他语句都复杂一些.循环中错误发生机会比其他代码构成部分多.因此,对于任何给定的循环测试应该包括测试下面每一条件的测试用例.
      a.循环不执行;
      b.执行一次循环;
      c.执行两次循环;
      d.反映执行典型的循环的执行次数;
      e.如果有最大循环次数,最大循环次数减1;
      f.最大循环次数;
      g.对于增量和减量不是1的FOR语句,要特别注意,因为程序员习惯于增量1;

    4.循环嵌套:循环嵌套使逻辑的次数呈几何级数增长,设计测试嵌套循环的测试用例应该包括的测试条件有:
      a.把外循环设置为最小值,并运行内循环所有可能的情况;
      b.把内循环设置为最小值,并运行外循环所有可能的情况;
      c.把所有的循环变量都设置为最小值运行;
      d.把所有的循环变量都设置为最大值运行;
      e.把外循环设置为最大值,并运行内循环所有可能的值;
      f.把内循环设置为最大值,并运行外循环所有可能的值;

    5.边界值测试:指程序内部边界测试.检查确定代码在任何边界情况下都不会出差错.重点检查小于,等于和大于边界条件的情况.边界值测试指专门设计用来测试当条件语句中引用的值处在边界或边界附近时系统反映的测试.被测试语句的最好的例子就是"if-then-else-endif"部分.这样的语句的例子如:
      if a<=123 then
         b=1
      else if a>=123 then
         b=2
      else
         b=3
      end if
      上面例子中的边界值测试用例应该至少包括a的以下值:122,123,124.当a=123时,b=1还是2.

    6.接口测试:检查模块的数据流(输入,输出)是否正确.检查输入的参数和声明的自变量的个数,数据类型和输入顺序是否一致.检查全局变量是否被正确的定义和使用等.

    7.确认测试:是否接受有效输入数据(操作),拒绝无效数据(操作).

    8.事务测试:输入--输出,错误处理.

  • 测试覆盖率

    2007-10-14 15:37:57

    语句覆盖(StatementCoverage):也称为行覆盖(linecoverage),段覆盖(segmentcoverage)和基本块覆盖(basicblockcoverage)。它度量每一个可执行语句是否被执行到了,这个覆盖度量的主要好处是它可以直接应用在目标代码上,不需要对源代码进行处理,主要缺点是对一些控制结构很迟钝。

    判定覆盖(DecisionCoverage):也被称为分支覆盖(branchcoverage),所有边界覆盖(all-edgescoverage),基本路径覆盖(basispathcoverage),C2覆盖,判定路径覆盖(decision-decision-path或DDPtesting)。它度量是否每个BOOL型的表达式取值true和false在控制结构中都被测试到了。这个度量有语句覆盖的简单性,但是没有语句覆盖的问题,缺点是忽略了在BOOL型表达式内部的BOOL取值。

    条件覆盖(ConditionCoverage):它独立的度量每一个子表达式,报告每一个子表达式的结果的true或false。这个度量和判定覆盖(decisioncoverage)相似,但是对控制流更敏感。不过,完全的条件覆盖并不能保证完全的判定覆盖。

    判定条件覆盖(Decision Condition Coverage):也被称为分支条件覆盖(Branch Condition Coverage),在测试时运行被测程序后,所有判断语句中每个条件的所有可能值(真或假)和每个判断本身的判定结果(真或假)出现的比率。

    路径覆盖(PathCoverage):也称为断言覆盖(predicatecoverage),它度量了是否函数的每一个可能的分支都被执行了。路径覆盖的一个好处是:需要彻底的测试。但有两个缺点:一是,路径是以分支的指数级别增加的,例如:一个函数包含10个IF语句,就有1024个路径要测试。如果加入一个IF语句,路径数就达到2048;二是,许多路径不可能与执行的数据无关。

    循环覆盖(LoopCoverage):这个度量报告你是否执行了每个循环体零次、只有一次还是多余一次(连续地)。对于do-while循环,循环覆盖报告你是否执行了每个循环体只有一次还是多余一次(连续地)。这个度量的有价值的方面是确定是否对于while循环和for循环执行了多于一次,这个信息在其它的覆盖率报告中是没有的。

  • 双V模型(图)

    2007-10-14 15:28:08

  • 有用的sql日期函数

    2007-10-10 17:22:43

    1.一个月的第一天
    Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

    2.
    本周的星期一
    Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

    3.
    一年的第一天
    Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

    4.
    季度的第一天
    Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

    5.
    当天的半夜
    Select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

    6.
    上个月的最后一天
    Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

    7.
    去年的最后一天
    Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

    8.
    本月的最后一天
    Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

    9.
    本年的最后一天
    Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

    10.
    本月的第一个星期一
    select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)

301/212>

数据统计

  • 访问量: 21306
  • 日志数: 30
  • 建立时间: 2007-10-02
  • 更新时间: 2007-11-14

RSS订阅

Open Toolbar