iTimothy

君看一叶舟,出没风波里


  • 首页

  • 分类

  • 归档

  • 项目

  • 关于

Visual Studio 2010 Beta1 is available for download

发表于 2009-05-26 | 分类于 技术控 | | 阅读次数:
字数统计: 61 字 | 阅读时长 ≈ 1 分钟

You can download it by two ways below:

ISO:http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID;=3296bb4f-d8ba-4cfd-aa95-a424c5913f6b

WebInstaller:http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID;=75cbcbcd-b0e8-40ea-adae-85714e8984e3

The new feature of VS2010:

Enhanced user experience, Parallel programming,support for Cloud development and support more databases,such as DB2 and oracle.

小黑降温记

发表于 2009-05-22 | 分类于 数码控 | | 阅读次数:
字数统计: 401 字 | 阅读时长 ≈ 1 分钟

夏日临近,天气一天比一天热,无意中用工具看了看CPU温度,竟然也上了70度。要是天气再热一点,估计小黑撑不过这个夏天了。

1

本打算去电脑城打开清理一下,但是又考虑到没那样的闲心跑电脑城,本着DIY的精神,打算自己来给小黑降降温,一个字:拆!。先在网上看相关的拆机教程,又在淘宝上找了一圈,发现一个卖家的东西还不错:电脑工具套装,包括N合一的螺丝刀,润滑油,导热硅脂,电脑清洁套装,一整套东西,60多来块,感觉还算便宜,于是拍下了。下班回家,便开始了拆机的历程。

首先需要拆下背面的螺丝,包括键盘、手托、U型框的固定螺丝,N颗。

P5070147取下键盘和手托,CPU就藏在下面

P5070152然后取下U型框,这个不取下来,CPU风扇是取不了的

P5070153

取下固定CPU风扇的螺丝,准备拆下风扇P5070154拿下风扇,CPU露出来了…

P5070156

今天的主角:导热硅脂和润滑脂 淘宝货 P5070157取下CPU风扇,把风扇打开 P5070159取下扇叶,把润滑脂弄到那个小电动机的小孔里面

P5070161给CPU和显卡芯片抹上导热硅脂,装好风扇和键盘,开机裸奔测试效果

P5220163裸奔一段时间,发现温度在50度一下,比较满意

3

把机器还原,然后再跑一段时间,发现温度在60度左右,不错. 打完收工~~

5

Windows 7 新特性体验

发表于 2009-05-02 | 分类于 技术控 | | 阅读次数:
字数统计: 903 字 | 阅读时长 ≈ 3 分钟

要说本年度最值得期待的事,估计就是等待Windows 7的正式版发布了。或许是经历了Vista的失败,微软在痛定思痛过后,决心以Windows 7的推出挽回更多因为Vista而丢失的用户。而我也不例外,虽然我也用着Vista,其实也迫不及待的等待着Windows 7正式版的发布。自从Windows 7 Beta版推出以来,我就很贪婪的在网上关注着每个Win7 Build版本的出现。终于,微软官方发话了,说Windows 7 正式版将在今年圣诞之前发布。在期待正式版的同时,我也迫不及待的在虚拟机上装上了Beta版。体验之余,发现有很多很好的,激动人心的改进,截图分享下。

1.任务栏改进

1

采用了大图标,看起来更加直观,也更加方便带触摸屏的电脑进行触摸操作,并且这些图标对应的程序都有对应的快捷键,方便用户快捷操作。比如图中的浏览器图标,对应Win+1组合键,Media Player对应Win+3键。你也试试看?对应的数字,和图标的排序有关。(其实这功能Vista里面也有,不知道你发现没有,呵呵)

2

增加了”图钉”功能,你能把常用的程序用图钉”钉”在任务栏上。还可以使用鼠标右键,拖动你常用的文件夹到任务栏上,这样,文件夹会被钉在Explorer的弹出菜单上。

3

任务栏通知区域也有了改进,多个程序提醒图标被放到了一个弹出的List里面,更加节约空间和美观。

2.UAC提示的改进

这个用过Vista的人都知道,频繁的UAC提示让人心烦,也让人反感。微软也宣布,Windows 7的UAC提示会比Vista减少三分之一左右。并且,Windows 7也提供了方便关闭UAC提示的功能。整个UAC控制被分成四级,供用户调整。

• 当用户在安装软件或修改Windows系统设置时总是提醒用户(与Vista系统相同)。

• 当用户在安装软件时提醒用户,在修改Windows设置时不提醒用户(当前默认设置)。

• 在用户安装软件时提醒用户,但是关闭UAC安全桌面,即提示用户时桌面其它区域不会失效。

• 从来不提醒用户(不推荐这种方式)

4

  1. Action Center

你也许会疑惑,好像在Windows 7里面没看到那个著名的”安全中心”的影子。其实Windows 7有了个新的功能:Action Center,而以前的安全中心也被融入到了其中。Action Center中除了包括原先的安全设置,还包含了其它管理任务所需的选项,如Backup, Troubleshooting And Diagnostics以及 Windows Update等功能。

5

  1. XP模式

为兼容一些老的程序,XP模式能在Windows 7中模拟XP系统环境,此”XP模式”不会内置于Windows 7,而是用户在购买Windows 7专业版、企业版或最终版后,通过免费下载获得。XP模式,由Virtual PC虚拟环境和完整Windows XP SP3授权共同组成,并将免费提供给Windows 7 Professional、Enterprise和Ultimate版本用户。

其实还有很多令人激动的特性,就不一一列举了,非常期待Windows 7正式版能早日发布。

如果你也下载了Windows 7的Beta版,你可以免费在微软的官方网页上申请试用的CDKEY: http://www.microsoft.com/windows/windows-7/beta-download.aspx

Unity 学习笔记(3) — 生命周期管理

发表于 2009-04-28 | 分类于 技术控 | | 阅读次数:
字数统计: 0 字 | 阅读时长 ≈ 1 分钟

换了新鼠标

发表于 2009-04-26 | 分类于 数码控 | | 阅读次数:
字数统计: 225 字 | 阅读时长 ≈ 1 分钟

最近我的鼠标开始罢工了,我的鼠标是罗技的V470-蓝牙激光鼠,同事推荐的,手感挺不错。不过用了一年多左右,左键开始失灵,经常左键单击变成了双击,怪不好使。周末在网上查了查罗技的售后,打电话去咨询了一下,说鼠标需要送修,地点就在磨子桥新世纪电脑城对面的楼上。到了售后那里,售后的大叔说鼠标需要留下维修,然后转身直接给我拿了个新的,当时我晕了,原来还可以这样……以前用的是蓝色的,现在没蓝色的了,只好要了个黑色的。感觉还是蓝色的比较好看,不过黑色的和小黑还是挺般配的。总的感觉,罗技的产品和售后都挺不错,表扬一下!

P4250139

Unity 学习笔记(2) — 配置文件的使用

发表于 2009-04-25 | 分类于 技术控 | | 阅读次数:
字数统计: 0 字 | 阅读时长 ≈ 1 分钟

Unity 学习笔记(1) -- Unity简介及简单使用

发表于 2009-04-23 | 分类于 技术控 | | 阅读次数:
字数统计: 3.5k 字 | 阅读时长 ≈ 18 分钟

Unity是微软Patterns & Practices团队所开发的一个轻量级的,并且可扩展的依赖注入(Dependency Injection)容器,它支持常用的三种依赖注入方式:构造器注入(Constructor Injection)、属性注入(Property Injection),以及方法调用注入(Method Call Injection).现在Unity最新的版本的1.2版,可以在微软的开源站点http://unity.codeplex.com下载最新的发布版本和文档。通过使用Unity,我们能轻松构建松耦合结构的程序,从而让整个程序框架变得清晰和易于维护。

在平常的软件编码过程中,程序的逻辑往往很复杂,尤其是大型项目的开发中,一个模块常常会去引用其他的模块,假设我们有一个监控器类,用来监控CPU的温度,当温度达到预警的范围时,监控器有一个报警的方法,方法里面通过短信提醒器,以发送短信的方式通知维护人员。于是就出现了下面这样一段最为常见的代码:

<span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> Monitor




<span class="lnum">   2:  </span>{




<span class="lnum">   3:  </span>       <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()




<span class="lnum">   4:  </span>       {




<span class="lnum">   5:  </span>               SMSNotify notify = <span class="kwrd">new</span> SMSNotify();




<span class="lnum">   6:  </span>               notify.Send();




<span class="lnum">   7:  </span>        }




<span class="lnum">   8:  </span>}

在Monitor类中,直接引用到了一个短信提醒器的类,这是最为不灵活和最不易于扩展的一种方式。或许我们想到了面向接口编程,利用多态的好处,可以提供灵活的不同子类的实现,增加代码扩展性等等。但是说到底,接口一定是需要实现的,也就是如下语句迟早要执行:

<span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()




<span class="lnum">   2:  </span>{




<span class="lnum">   3:  </span>       INotify notify = <span class="kwrd">new</span> SMSNotify();




<span class="lnum">   4:  </span>       notify.Send();




<span class="lnum">   5:  </span>}

这样看来,在实现INotify这个接口的时候,仍然需要具体的类来实现,而这样的代码在程序编译的时候就已经固定下来,如果以后需要使用新的提醒器,仍旧需要修改源代码并重新编译。并且在我们的Monitor类中,明显依赖SMSNotify类,二者之间的耦合度非常紧密。因此Ioc(控制反转)模式被提出用来解决这种问题,也即把接口的具体实现延缓到运行时,接口的实现类是在运行时被装载的。这样,就算有了新的实现类,也不需要更改调用者的代码(可以在Unity中使用配置文件的方式实现)。这种Ioc模式可以被形象的比喻为:接口就像一个空壳,而在具体实现时,向这个空壳注入内容,而让它成为一个真正的实体。这种模式也被形象的称为:依赖注入。通过使用Unity,我们能构建松耦合的软件,并且对象之间相互关联的细节,我们也不必关心,可以交由依赖注入容器全权负责。

前面也提到了依赖注入常用的三种形式:构造器注入、属性注入和方法调用注入,我们可以通过例子来实现这三种形式的注入。还是以上面的场景为例,我们的几个类和接口如下图:

1

1.Constructor Injection

IMonitor接口定义:

<span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">interface</span> IMonitor




<span class="lnum">   2:  </span>{




<span class="lnum">   3:  </span>    <span class="kwrd">void</span> Alarm();




<span class="lnum">   4:  </span>}

Monitor类:

<span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> Monitor : IMonitor




<span class="lnum">   2:  </span>{




<span class="lnum">   3:  </span>    <span class="kwrd">private</span> INotify notify;




<span class="lnum">   4:  </span>




<span class="lnum">   5:  </span>    <span class="kwrd">public</span> Monitor(INotify n)




<span class="lnum">   6:  </span>    {




<span class="lnum">   7:  </span>        notify = n;




<span class="lnum">   8:  </span>    }




<span class="lnum">   9:  </span>




<span class="lnum">  10:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()




<span class="lnum">  11:  </span>    {




<span class="lnum">  12:  </span>        notify.Send();




<span class="lnum">  13:  </span>    }




<span class="lnum">  14:  </span>}

INotify接口定义:

<span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">interface</span> INotify




<span class="lnum">   2:  </span>{




<span class="lnum">   3:  </span>    <span class="kwrd">void</span> Send();




<span class="lnum">   4:  </span>}

EmailNotify类:

<span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> EmailNotify : INotify




<span class="lnum">   2:  </span>{




<span class="lnum">   3:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> Send()




<span class="lnum">   4:  </span>    {




<span class="lnum">   5:  </span>        Console.WriteLine(<span class="str">"Send Email Notify..."</span>);




<span class="lnum">   6:  </span>    }




<span class="lnum">   7:  </span>}

SMSNotify类:

<span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> SMSNotify : INotify




<span class="lnum">   2:  </span>{




<span class="lnum">   3:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> Send()




<span class="lnum">   4:  </span>    {




<span class="lnum">   5:  </span>        Console.WriteLine(<span class="str">"Send SMS Notify..."</span>);




<span class="lnum">   6:  </span>    }




<span class="lnum">   7:  </span>}

可以看到,在Monitor类的构造函数里面,传入的参数是一个INotify接口类型,Alarm方法,调用了实现类的Send方法,但具体调用哪一个实现类的Send方法,只有在注入实体后才知道。Unity容器中,通常使用RegisterType和Resolve方法来分别注册和获取实例,并且这两个方法有很多泛型和非泛型的重载,具体的类型和参数,可以参考Unity的官方帮助文档。

现在我们向Monitor的构造函数注入实现INotify接口的实例:

<span class="lnum">   1:  </span><span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)




<span class="lnum">   2:  </span>{




<span class="lnum">   3:  </span>    IUnityContainer container = <span class="kwrd">new</span> UnityContainer();




<span class="lnum">   4:  </span>    container.RegisterType<IMonitor, Monitor>().RegisterType<INotify, SMSNotify>();




<span class="lnum">   5:  </span>




<span class="lnum">   6:  </span>    IMonitor monitor = container.Resolve<IMonitor>();




<span class="lnum">   7:  </span>    monitor.Alarm();




<span class="lnum">   8:  </span>




<span class="lnum">   9:  </span>    Console.ReadLine();




<span class="lnum">  10:  </span>}

代码中我们注入的INotify实例是SMSNotify类的实例,然后调用monitor.Alrarm(),里面会调用notify.Send(). 运行查看结果: 2上面是针对单个构造函数的情况,如果有多个构造函数,需要指明哪个构造函数是需要被注入的,也即需要在指定被注入的构造函数加上attribute:InjectionConstructor

<span class="lnum">   1:  </span><span class="kwrd">public</span> Monitor(INotify n, <span class="kwrd">string</span> name)




<span class="lnum">   2:  </span>{




<span class="lnum">   3:  </span>    notify = n;




<span class="lnum">   4:  </span>}




<span class="lnum">   5:  </span>




<span class="lnum">   6:  </span>[InjectionConstructor]




<span class="lnum">   7:  </span><span class="kwrd">public</span> Monitor(INotify n)




<span class="lnum">   8:  </span>{




<span class="lnum">   9:  </span>    notify = n;




<span class="lnum">  10:  </span>}

运行后可得到一样的结果.

2.Property Injection

通过属性注入,我们需要加上attribute: Dependency,使得Unity容器在获取类对象实例时,自动实例化该属性所依赖的对象,并注入到属性中。

修改Monitor类,实现下面的代码:

<span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> Monitor : IMonitor




<span class="lnum">   2:  </span>{




<span class="lnum">   3:  </span>    [Dependency]




<span class="lnum">   4:  </span>    <span class="kwrd">public</span> INotify Notify { get; set; }




<span class="lnum">   5:  </span>




<span class="lnum">   6:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()




<span class="lnum">   7:  </span>    {




<span class="lnum">   8:  </span>        Notify.Send();




<span class="lnum">   9:  </span>    }




<span class="lnum">  10:  </span>}

再在Main函数里面,修改原有的代码,这次我们让容器注入EmailNotify实例:

<span class="lnum">   1:  </span>container.RegisterType<INotify, EmailNotify>();

运行查看结果: 3还有一个比较方便的地方,可以为Dependency特性指定名称,这样,在注入时,会将RegisterType所指定的对应名称的实体进行注入,例如:

<span class="lnum">   1:  </span>    <span class="kwrd">public</span> <span class="kwrd">class</span> Monitor : IMonitor




<span class="lnum">   2:  </span>    {




<span class="lnum">   3:  </span>        [Dependency(<span class="str">"SMS"</span>)]




<span class="lnum">   4:  </span>        <span class="kwrd">public</span> INotify Notify { get; set; }




<span class="lnum">   5:  </span>




<span class="lnum">   6:  </span>        <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()




<span class="lnum">   7:  </span>        {




<span class="lnum">   8:  </span>            Notify.Send();




<span class="lnum">   9:  </span>        }




<span class="lnum">  10:  </span>    }

修改Main函数,在RegisterType函数中指定注入名称:

<span class="lnum">   1:  </span>            container.RegisterType<INotify, EmailNotify>(<span class="str">"Email"</span>);




<span class="lnum">   2:  </span>            container.RegisterType<INotify, SMSNotify>(<span class="str">"SMS"</span>);

运行查看结果: 2

3.Method Call Injection

Method Call Injection注入的时机和Constructor Injection有一定的区别,构造函数注入,是在容器创建实例的时候,而方法调用注入,是在方法被调用的时候。实现方法调用注入,需要在指定注入的方法前加上attribute: InjectionMethod

修改Monitor类的代码如下:

<span class="lnum">   1:  </span>    <span class="kwrd">public</span> <span class="kwrd">class</span> Monitor : IMonitor




<span class="lnum">   2:  </span>    {




<span class="lnum">   3:  </span>        <span class="kwrd">private</span> INotify notify;




<span class="lnum">   4:  </span>




<span class="lnum">   5:  </span>        [InjectionMethod]




<span class="lnum">   6:  </span>        <span class="kwrd">public</span> <span class="kwrd">void</span> GetNotify(INotify n)




<span class="lnum">   7:  </span>        {




<span class="lnum">   8:  </span>            notify = n;




<span class="lnum">   9:  </span>        }




<span class="lnum">  10:  </span>




<span class="lnum">  11:  </span>        <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()




<span class="lnum">  12:  </span>        {




<span class="lnum">  13:  </span>            notify.Send();




<span class="lnum">  14:  </span>        }




<span class="lnum">  15:  </span>    }

在程序运行时,容器会自动实例化GetNotify方法所依赖的对象,并自动调用该方法,将其注入到方法中。

Main函数如下:

<span class="lnum">   1:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)




<span class="lnum">   2:  </span>        {




<span class="lnum">   3:  </span>            IUnityContainer container = <span class="kwrd">new</span> UnityContainer();




<span class="lnum">   4:  </span>            container.RegisterType<IMonitor, Monitor>();




<span class="lnum">   5:  </span>            container.RegisterType<INotify, EmailNotify>();




<span class="lnum">   6:  </span>




<span class="lnum">   7:  </span>            IMonitor monitor = container.Resolve<IMonitor>();




<span class="lnum">   8:  </span>            monitor.Alarm();




<span class="lnum">   9:  </span>




<span class="lnum">  10:  </span>            Console.ReadLine();




<span class="lnum">  11:  </span>        }

运行查看结果:

3

WAP Access is available!

发表于 2009-04-21 | 分类于 技术控 | | 阅读次数:
字数统计: 41 字 | 阅读时长 ≈ 1 分钟

此博客的WAP访问地址已经开启,现在你可以使用手机随时随地的通过以下地址进行访问:

http://m.xiaozhou.net

电信3G无线体验

发表于 2009-04-20 | 分类于 数码控 | | 阅读次数:
字数统计: 381 字 | 阅读时长 ≈ 1 分钟

无意中听同事说,成都电信最近推出了3G无线宽带免费体验的活动,我也在网上预约了。周六一大早,跑了一趟营业厅,拿回了传说中的无线上网卡,一番折腾过后,终于连上了3G网络体验了一把3G冲浪。电信的3G网络,号称可以达到下行3.1Mbps,上行1.8Mbps,而在试用的过程中,发现速度确实如此,看来3G离我们越来越近了……直接上图了。

拿回的无线上网卡,中兴的,如图:

P4200135

样子看起来很像个U盘,USB接口,卡壳里面可以插一张卡,其实也就是个189的手机卡,开通了3G宽带数据业务,也可以用来打电话,不过在宽带免费体验期间,话费另计。

P4200136

旁边有一个可以转动的天线

P4200137插上我的机器 P4200138

插入后,发现多一个虚拟光驱,里面有拨号程序和驱动程序

1

安装驱动和拨号软件

2

拨号软件界面

4

拨号成功后,马上下载软件测试,发现电信的3G速度确实不是吹的,最快达到300KB/S,平均下载速度都在200KB/S以上……这简直比家里的2MBps的ADSL还快了。

6总的说来,电信的3G确实不错,巴巴掌~~不过资费确实有点让人接受不了, 打算免费体验完后退掉无线上网卡,等以后降价了再作打算……

blog恢复正常

发表于 2009-04-11 | 分类于 站点日志 | | 阅读次数:
字数统计: 68 字 | 阅读时长 ≈ 1 分钟

前两天发现blog不能访问了,问了空间服务商,发现空间到期了。。无奈,自己机器上的备份不是最新的,所以部分评论和留言丢失,见谅……看来以后经常备份数据库才是王道。

Microsoft My Phone 体验

发表于 2009-03-07 | 分类于 技术控 | | 阅读次数:
字数统计: 438 字 | 阅读时长 ≈ 1 分钟

21世纪什么最重要?当然是手机里面的联系人和电话号码!没法想象,当你的手机遗失的时候,往往令人遗憾的或许不是手机本身,而是手机上成百上千联系人号码的丢失,就算你重新换了手机,你的朋友、同事的电话号码也只有一个一个的重新录入,那真是相当的折磨人啊……

不过现在Windows Mobile的用户有福气了,微软新推出的MyPhone服务,能彻底让你远离这样的噩梦,使用MyPhone,能自动帮你同步你的联系人电话号码、短信、手机里面的相片、音乐到网上,就算你的手机不幸遗失了,联系人还在,这可方便多了。不过现在MyPhone刚开放Beta版本供用户使用,使用前需要申请排队。

等了几天,终于等到了申请回复的邮件,于是今天我也打算来MyPhone一把。不说了,直接上图体验!

MyPhone的安装界面,需要下载相应的软件到你的Windows Mobile手机并安装

手机访问安装包的网址,下载安装包到手机并安装

安装过程

安装过后的程序图标

初次运行

使用MyPhone需要Windows Live ID登录

选择同步方法

选择需要同步的内容

开始同步了

同步完成,这样也可以通过PC上的浏览器查看同步到网上的内容了

MyPhone的Web登录界面,左边的菜单项目,和手机上同步的内容选项一致

这就是从手机自动同步到网上的联系人列表,具体的内容被我PS掉了。呵呵

SQL中的日期计算

发表于 2009-02-22 | 分类于 技术控 | | 阅读次数:
字数统计: 642 字 | 阅读时长 ≈ 2 分钟

这两天写一个和统计数据有关的存储过程,里面要利用日期进行一些计算和判断,也自然要利用SQL的一些日期相关的函数。这里略记一下,当是复习一下SQL。

利用SQL脚本内置的几个函数,我们能灵活的对日期进行计算和比较。常用的几个函数:GETDATE(),DATEDIFF(),DATEADD()

GETDATE() 当然顾名思义,得到当前的日期,返回类型是DateTime类型。

DATEDIFF ( datepart , startdate , enddate ) 用于判断在两个日期之间存在的指定时间间隔的数目。

第一个参数是指定时间间隔的类型,例如mm(月),dd(天),yy(年),ms(毫秒),ss(秒),不同的间隔类型,返回的结果也不一样。

DATEADD (datepart , number, date ) 用于日期运算的函数,将传入的日期,加上指定时间间隔数目的日期。

例如,计算得到本年的第一天:

Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

我们来分析下这个SQL语句就可以知道,首先从最里面的getdate()开始,getdate()得到当前日期和时间,外层的datediff,计算当前日期和1900-01-01 00:00:00之间的时间间隔,返回单位是以年来统计的,如果我们分开看DATEDIFF(yy,0,getdate()),0)的结果,返回就是:109。返回的109,传递给最外层的DATEADD函数,将1900-01-01 00:00:00加上109年,得到的结果,自然就是2009-01-01 00:00:00了,也即本年的第一天。

同样,灵活的利用这几个函数的组合,我们可以得到不同的结果:

得到当月的第一天:Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

得到当前季度的第一天:Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

得到当天的起始时间: Select DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

得到上个月最后一天: Select DATEADD(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

得到上个月的第一天: Select DATEADD(m,-1,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

其原理就是得到当月第一天,再减去三毫秒(SQL的时间以3毫秒为一个单位),这样以当前为2月,得到的结果就是:2009-01-31 23:59:59.997

得到去年的最后一天: Select DATEADD(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

得到本月的最后一天: Select DATEADD(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

得到本年的最后一天: Select DATEADD(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

得到本月的第一个星期一: Select DATEADD(wk, DATEDIFF(wk,0,DATEADD(dd,6-datepart(day,getdate()),getdate())), 0)

1…313233…47
Timothy

Timothy

Timothy的技术博客,记录技术以及生活点滴

564 日志
8 分类
1187 标签
RSS
github twitter
Links
  • ZWWoOoOo
  • 花開未央
  • 守望轩
  • 大漠说程序
  • ChengBo
  • BlueAndHack
  • 程序员小辉
  • 子痕的博客
  • WoodenRobot
  • VPS大佬
  • 毕扬博客
  • VPSDad
  • 猫爪导航
  • ss1271的奋斗
  • Kian.Li
  • YoungForest
  • Fred's Blog
  • Jacklandrin
© 2025 Timothy
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4