<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_在拼搏中成长</title><subtitle type="text">成功的人总是在找方法，失败的人总是在找理由，我要成功。</subtitle><id>http://feed.cnblogs.com/blog/u/33929/rss</id><updated>2012-02-02T01:07:30Z</updated><author><name>Robert.H.fu</name><uri>http://www.cnblogs.com/luohoufu/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luohoufu/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/33929/rss"/><entry><id>http://www.cnblogs.com/luohoufu/archive/2011/02/21/1960059.html</id><title type="text">编程连接远程SQL服务器出现问题及对策</title><summary type="text">一."SQL Server 不存在或访问被拒绝"这个是最复杂的,错误发生的原因比较多,需要检查的方面也比较多.一般说来,有以下几种可能性:1,SQL Server名称或IP地址拼写有误2,服务器端网络配置有误3,客户端网络配置有误要解决这个问题,我们一般要遵循以下的步骤来一步步找出导致错误的原因.============= 首先,检查网络物理连接 =============ping &lt;服务器IP地址/服务器名称&gt;如果 ping &lt;服务器IP地址&gt; 不成功,说明物理连接有问题,这时候要检查硬件设备,如网卡,HUB,路由器等.还有一种可能是由于客户端和服务器之间安装有防火墙</summary><published>2011-02-21T11:45:00Z</published><updated>2011-02-21T11:45:00Z</updated><author><name>Robert.H.fu</name><uri>http://www.cnblogs.com/luohoufu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luohoufu/archive/2011/02/21/1960059.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luohoufu/archive/2011/02/21/1960059.html"/><content type="html">&lt;p&gt;一."SQL Server 不存在或访问被拒绝"&lt;/p&gt;&lt;p&gt;这个是最复杂的,错误发生的原因比较多,需要检查的方面也比较多.&lt;/p&gt;&lt;p&gt;一般说来,有以下几种可能性:&lt;/p&gt;&lt;p&gt;1,SQL Server名称或IP地址拼写有误&lt;br /&gt;2,服务器端网络配置有误&lt;br /&gt;3,客户端网络配置有误&lt;/p&gt;&lt;p&gt;要解决这个问题,我们一般要遵循以下的步骤来一步步找出导致错误的原因.&lt;/p&gt;&lt;p&gt;============= 首先,检查网络物理连接 =============&lt;/p&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;ping &amp;lt;服务器IP地址/服务器名称&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;如果 ping &amp;lt;服务器IP地址&amp;gt; 不成功,说明物理连接有问题,这时候要检查硬件设备,如网卡,HUB,路由器等.&lt;br /&gt;还有一种可能是由于客户端和服务器之间安装有防火墙软件造成的,比如 ISA Server.防火墙软件可能会屏蔽对 ping,telnet 等的响应。因此在检查连接问题的时候,我们要先把防火墙软件暂时关闭,或者打开所有被封闭的端口.&lt;/p&gt;&lt;p&gt;如果ping &amp;lt;服务器IP地址&amp;gt; 成功而,ping &amp;lt;服务器名称&amp;gt; 失败，则说明名字解析有问题,这时候要检查 DNS 服务是否正常.（&lt;font color="#800000"&gt;这时如果其它地方（服务器配置，连接字符串&amp;#8230;&amp;#8230;等）没问题，则用&amp;lt;服务器IP地址&amp;gt;可以连接成功&lt;/font&gt;）&lt;br /&gt;如果希望直接使用服务器名称来标识该服务器,这时候我们可以使用HOSTS文件来进行名字解析，具体的方法是:&lt;/p&gt;&lt;p&gt;1.使用记事本打开HOSTS文件（一般情况下位于C:\WINNT\system32\drivers\etc）.&lt;br /&gt;添加一条IP地址与服务器名称的对应记录,如:&lt;br /&gt;172.168.10.24 myserver&lt;/p&gt;&lt;p&gt;2.或在 SQL Server 的客户端网络实用工具里面进行配置,后面会有详细说明.&lt;/p&gt;&lt;p&gt;============= 其次,使用 telnet 命令检查SQL Server服务器工作状态 =============&lt;br /&gt;&lt;font color="#0000ff"&gt;telnet &amp;lt;服务器IP地址&amp;gt; 1433&lt;/font&gt;&lt;/p&gt;&lt;p&gt;如果命令执行成功,可以看到屏幕一闪之后光标在左上角不停闪动,这说明 SQL Server 服务器工作正常,并且正在监听1433端口的 TCP/IP 连接&lt;br /&gt;如果命令返回"无法打开连接"的错误信息,则说明服务器端没有启动 SQL Server 服务,&lt;br /&gt;也可能服务器端没启用 TCP/IP 协议,或者服务器端没有在 SQL Server 默认的端口1433上监听.&lt;/p&gt;&lt;p&gt;=============接着,我们要到服务器上检查服务器端的网络配置,检查是否启用了命名管道.是否启用了 TCP/IP 协议等等 =============&lt;br /&gt;可以利用 SQL Server 自带的服务器网络使用工具来进行检查.&lt;/p&gt;&lt;p&gt;点击:程序 -- Microsoft SQL Server -- 服务器网络使用工具&lt;/p&gt;&lt;p&gt;打开该工具后,在"常规"中可以看到服务器启用了哪些协议.&lt;br /&gt;一般而言,我们启用命名管道以及 TCP/IP 协议.&lt;br /&gt;点中 TCP/IP 协议,选择"属性",我们可以来检查 SQK Server 服务默认端口的设置&lt;br /&gt;一般而言,我们使用 SQL Server 默认的1433端口.如果选中"隐藏服务器",则意味着客户端无法通过枚举服务器来看到这台服务器,起到了保护的作用,但不影响连接.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;============= 接下来我们要到客户端检查客户端的网络配置 =============&lt;br /&gt;我们同样可以利用 SQL Server 自带的客户端网络使用工具来进行检查,&lt;br /&gt;所不同的是这次是在客户端来运行这个工具.&lt;/p&gt;&lt;p&gt;点击:程序 -- Microsoft SQL Server -- 客户端网络使用工具&lt;/p&gt;&lt;p&gt;打开该工具后,在"常规"项中,可以看到客户端启用了哪些协议.&lt;br /&gt;一般而言,我们同样需要启用命名管道以及 TCP/IP 协议.&lt;br /&gt;点击 TCP/IP 协议,选择"属性",可以检查客户端默认连接端口的设置,该端口必须与服务器一致.&lt;/p&gt;&lt;p&gt;单击"别名"选项卡,还可以为服务器配置别名.服务器的别名是用来连接的名称,&lt;br /&gt;连接参数中的服务器是真正的服务器名称,两者可以相同或不同.别名的设置与使用HOSTS文件有相似之处.&lt;/p&gt;&lt;p&gt;通过以上几个方面的检查,基本上可以排除第一种错误.&lt;/p&gt;&lt;p&gt;二."无法连接到服务器,用户xxx登陆失败"&lt;/p&gt;&lt;p&gt;原因1、该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,&lt;br /&gt;因此用户无法使用SQL Server的登录帐户（如 sa ）进行连接.解决方法如下所示:&lt;/p&gt;&lt;p&gt;1.在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server&lt;br /&gt;2.展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡&lt;br /&gt;3.在"身份验证"下,选择"SQL Server和 Windows ".&lt;br /&gt;4.重新启动SQL Server服务.&lt;/p&gt;&lt;p&gt;在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,&lt;br /&gt;那就通过修改注册表来解决此问题:&lt;/p&gt;&lt;p&gt;1.点击"开始"-"运行",输入regedit,回车进入注册表编辑器&lt;br /&gt;2.依次展开注册表项,浏览到以下注册表键:&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]&lt;br /&gt;3.在屏幕右方找到名称"LoginMode",双击编辑双字节值&lt;br /&gt;4.将原值从1改为2,点击"确定"&lt;br /&gt;5.关闭注册表编辑器&lt;br /&gt;6.重新启动SQL Server服务.&lt;/p&gt;&lt;p&gt;此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,&lt;br /&gt;但是仍然无法使用Windows身份验证模式来连接SQL Server.&lt;br /&gt;这是因为在 SQL Server 中有两个缺省的登录帐户:&lt;br /&gt;BUILTIN\Administrators&lt;br /&gt;&amp;lt;机器名&amp;gt;\Administrator 被删除.&lt;br /&gt;要恢复这两个帐户,可以使用以下的方法:&lt;/p&gt;&lt;p&gt;1.打开企业管理器,展开服务器组,然后展开服务器&lt;br /&gt;2.展开"安全性",右击"登录",然后单击"新建登录"&lt;br /&gt;3.在"名称"框中,输入 BUILTIN\Administrators&lt;br /&gt;4.在"服务器角色"选项卡中,选择"System Administrators" &lt;br /&gt;5.点击"确定"退出&lt;br /&gt;6.使用同样方法添加 &amp;lt;机器名&amp;gt;\Administrator 登录.&lt;/p&gt;&lt;p&gt;说明:&lt;/p&gt;&lt;p&gt;以下注册表键:&lt;br /&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode&lt;br /&gt;的值决定了SQL Server将采取何种身份验证模式.&lt;br /&gt;1.表示使用"Windows 身份验证"模式&lt;br /&gt;2.表示使用混合模式（Windows 身份验证和 SQL Server 身份验证）.&lt;/p&gt;&lt;p&gt;原因2、&lt;font color="#800000"&gt;密码不对。&lt;/font&gt;这种情况很特殊，就是你的系统里安装了几种软件（当然它们不都是你做的），都要用到SQL数据库，你发现当它们之中的一个好用时，你的程序就出现"无法连接到服务器,用户xxx登陆失败"（这里的XXX通常会是sa--因为它是SQL的内置帐号），于是你开始检查服务器的各项配置，直到更改了sa帐号的密码，你发现你的程序可以连接成功了，但你同时发现那个软件却连接数据库失败了。这时你也就发现了原因：有些商业软件安装后会修改SQL的内置帐号sa的密码来增加安全性，但这样一来你的程序就不能利用sa帐号进入来连接服务器了。&lt;/p&gt;&lt;p&gt;解决方法：新建一个&amp;#8220;标准&amp;#8221;类型的帐号，你的程序用这个帐号来连接服务器就可以了。&lt;br /&gt;新建帐号方法：&lt;br /&gt;&lt;font color="#800000"&gt;1.打开企业管理器,展开服务器组,然后展开服务器&lt;br /&gt;2.展开"安全性","登录",然后右击，选择"新建登录"&amp;#8230;&amp;#8230;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;三.提示连接超时&lt;/p&gt;&lt;p&gt;如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,&lt;br /&gt;不过是由于连接的时间大于允许的时间而导致出错.&lt;br /&gt;这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,&lt;br /&gt;并且是慢速连接时,有可能会导致以上的超时错误.有些情况下,由于局域网的网络问题,也会导致这样的错误.&lt;/p&gt;&lt;p&gt;要解决这样的错误,可以修改客户端的连接超时设置.&lt;br /&gt;默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,&lt;br /&gt;而查询分析器是 15 秒（这也是为什么在企业管理器里发生错误的可能性比较大的原因）.&lt;/p&gt;&lt;p&gt;具体步骤为:&lt;br /&gt;企业管理器中的设置:&lt;br /&gt;1.在企业管理器中,选择菜单上的"工具",再选择"选项"&lt;br /&gt;2.在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡&lt;br /&gt;3.在"连接设置"下的"登录超时（秒）"右边的框中输入一个比较大的数字,如 20.&lt;/p&gt;&lt;p&gt;查询分析器中的设置:&lt;br /&gt;工具 -- 选项 -- 连接 -- 将登录超时设置为一个较大的数字&lt;/p&gt;&lt;p&gt;&lt;br /&gt;四.大部分机都用Tcp/ip才能成功，有次我发现用Named Pipes才可以？&lt;/p&gt;&lt;p&gt;这是因为在WINDOWS 2000以后的操作系统中，MS为解决SQL SERVER的安全问题将TCP/IP配置&lt;br /&gt;为SQLSERVER的默认连接协议，你可以在CLIENT NETWORK UTILITY中看到TCP/IP和NAME PIPE&lt;br /&gt;的顺序。&lt;/p&gt;&lt;p&gt;你也可以在：&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SuperSocketNetLib]&lt;br /&gt;"ProtocolOrder"=hex(7):74,00,63,00,70,00,00,00,00,00&lt;br /&gt;看到默认的协议。&lt;/p&gt;&lt;p&gt;2.怎么在程序中更改Named Pipes ， Tcp/ip ，其sql语句怎么写？&lt;br /&gt;你可以在上面提到的注册表的位置修改：&lt;br /&gt;CLIENT端：&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SuperSocketNetLib]&lt;br /&gt;"ProtocolOrder"=hex(7):74,00,63,00,70,00,00,00,00,00&lt;/p&gt;&lt;p&gt;SERVER端：&lt;br /&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\SuperSocketNetLib]&lt;br /&gt;"ProtocolOrder"=hex(7):74,00,63,00,70,00,00,00,00,00&lt;/p&gt;&lt;p&gt;我的问题应该属于第一类，遗憾的是我按照上面说的方法都不能解决这个问题。我使用：telnet &amp;lt;服务器IP地址&amp;gt; 1433 显示不能正确连接。按照说的方法也不能解决这个问题。有网友说出现1433端口不能连接的因为是Sql Server 2000没有打补丁的缘故，但我打过sp4后仍然不能正确连接1433端口。（在打SP4之前要先打SP3）&lt;br /&gt;我在web.config里的设置为：&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;appSettings&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--"data source=SASANK;initial catalog=CODER;persist security info=False;user id=sa;workstation id=SASANK;packet size=4096"--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key="ConnectionString" value="server=localhost;Trusted_Connection=false;user id=sa;password=sa;database=sichuan"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/appSettings&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;system.web&amp;gt;&lt;br /&gt;找了好久原因，都不行。&lt;br /&gt;后来试着将数据库连接项改为：&lt;br /&gt;&amp;lt;add key="ConnectionString" value="server=192.168.254.60;Trusted_Connection=false;user id=sa;password=sa;database=sichuan"/&amp;gt;也就是把其中的Server改为我的机器在局域网中的IP地址（注意我是本机调试，我把server改为机器名也不行），连接运行，竟然成功了！&amp;nbsp;&lt;/p&gt;&lt;p&gt;五、错误：在连接到SQL Server 2005时,在默认的设置下SQL不允许进行远程连接可能会导致此失败,(provider:TCP提供程序,erroe:0-由于目标机器积极拒绝,无法连接.)&lt;/p&gt;&lt;p&gt;解决方法：在服务器端，控制面板-&amp;gt;管理工具-&amp;gt;服务-&amp;gt;MSSQLSERVER(开启此服务，并设为自动)&lt;/p&gt;&lt;p&gt;六、在建立与服务器的连接时出错。在连接到 SQL Server 2005 时，在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: TCP 提供程序, error: 0 - 套接字操作遇到了一个已死的网络。)&lt;/p&gt;&lt;p&gt;解决方法：开始－程序－Sql Server 2005-配置工具－SQL Sevrer外围应用配置器－服务和连接的外围应用配置器－选择数据库－远程连接－选择TCP/UPD。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/luohoufu/aggbug/1960059.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/luohoufu/archive/2011/02/21/1960059.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/luohoufu/archive/2011/02/11/1951155.html</id><title type="text">SQL Server 中的时间算法</title><summary type="text">不需废话，直接上代码，注释很详细了，看懂肯定没问题啊！ DECLARE @Date DATETIME SET @Date=GETDATE() &amp;#8211;前一天，给定日期的前一天 SELECT DATEADD(DAY,-1,@Date) AS &amp;#8216;前一天&amp;#8217; &amp;#8211;后一天，给定日期的后一天 SELECT DATEADD(DAY,1,@Date) AS &amp;#8216;后一天&amp;#8217; GO &amp;#8211;月初，计算给定日期所在月的第一天 &amp;#8211;这个计算的技巧是先计算当前日期到&amp;#82</summary><published>2011-02-11T02:31:00Z</published><updated>2011-02-11T02:31:00Z</updated><author><name>Robert.H.fu</name><uri>http://www.cnblogs.com/luohoufu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luohoufu/archive/2011/02/11/1951155.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luohoufu/archive/2011/02/11/1951155.html"/><content type="html">&lt;div&gt;&lt;p&gt;不需废话，直接上代码，注释很详细了，看懂肯定没问题啊！&lt;/p&gt; &lt;p&gt;DECLARE @Date&amp;nbsp; DATETIME&lt;br /&gt; SET @Date=GETDATE()&lt;br /&gt; &amp;#8211;前一天，给定日期的前一天&lt;br /&gt; SELECT DATEADD(DAY,-1,@Date) AS &amp;#8216;前一天&amp;#8217;&lt;br /&gt; &amp;#8211;后一天，给定日期的后一天&lt;br /&gt; SELECT DATEADD(DAY,1,@Date) AS &amp;#8216;后一天&amp;#8217;&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;月初，计算给定日期所在月的第一天&lt;br /&gt; &amp;#8211;这个计算的技巧是先计算当前日期到&amp;#8220;1900-01-01&amp;#8221;的时间间隔数，然后把它加到&amp;#8220;1900-01-01&amp;#8221;上来获得特殊的日期，这个技巧可以用&amp;#8212;来计算很多不同的日期。&lt;br /&gt; DECLARE @Date&amp;nbsp; DATETIME&lt;br /&gt; SET @Date=GETDATE()&lt;br /&gt; SELECT DATEADD(MONTH,DATEDIFF(MONTH,&amp;#8217;1900-01-01&amp;#8242;,@Date),&amp;#8217;1900-01-01&amp;#8242;) AS &amp;#8216;所在月的第一天&amp;#8217;&lt;br /&gt; &amp;#8211;精简算法，根据SQL Server的时间表示方式可知，&amp;#8217;1900-01-01&amp;#8242; 可以用0代替&lt;br /&gt; SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0) AS &amp;#8216;所在月的第一天&amp;#8217;&lt;br /&gt; &amp;#8211;上面两种算法精确到天 时分秒均为00:00:00.000&lt;br /&gt; &amp;#8211;下面算法课以保留时分秒&lt;br /&gt; &amp;#8211;思路：用给定日期减去月第一天与给定日期差的天数&lt;br /&gt; SELECT DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;月末，计算给定日期所在月的最后一天&lt;br /&gt; DECLARE @Date&amp;nbsp; DATETIME&lt;br /&gt; SET @Date=GETDATE()&lt;br /&gt; &amp;#8211;思路：当前月的下一月1号在减1天&lt;br /&gt; SELECT DATEADD(DAY,-1,DATEADD(MONTH,1+DATEDIFF(MONTH,&amp;#8217;1900-01-01&amp;#8242;,@Date),&amp;#8217;1900-01-01&amp;#8242;)) AS &amp;#8216;所在月的最一天&amp;#8217;&lt;br /&gt; SELECT DATEADD(MONTH,1+DATEDIFF(MONTH,&amp;#8217;1900-01-01&amp;#8242;,@Date),&amp;#8217;1900-01-01&amp;#8242;)-1 AS &amp;#8216;所在月的最一天&amp;#8217;&lt;br /&gt; &amp;#8211;1900-01-01 用0代替&lt;br /&gt; SELECT DATEADD(DAY,-1,DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0)) AS &amp;#8216;所在月的最一天&amp;#8217;&lt;br /&gt; SELECT DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0)-1 AS &amp;#8216;所在月的最一天&amp;#8217;&lt;br /&gt; &amp;#8211;思路：与月初计算思路相同&lt;br /&gt; SELECT DATEADD(MONTH,DATEDIFF(MONTH,&amp;#8217;1989-12-31&amp;#8242;,@Date),&amp;#8217;1989-12-31&amp;#8242;) AS &amp;#8216;所在月的最一天&amp;#8217;&lt;br /&gt; &amp;#8211;精简算法，&amp;#8217;1989-12-31&amp;#8242; 用-1代替&lt;br /&gt; SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date),-1) AS &amp;#8216;所在月的最一天&amp;#8217;&lt;br /&gt; &amp;#8211;保留时分秒的算法&lt;br /&gt; SELECT DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)))&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;其他月计算&lt;/p&gt; &lt;p&gt;&amp;#8211;计算给定日期所在月的上月第一天&lt;br /&gt; DECLARE @Date&amp;nbsp; DATETIME&lt;br /&gt; SET @Date=GETDATE()&lt;br /&gt; &amp;#8211;当前月第一天减去一个月&lt;br /&gt; SELECT DATEADD(MONTH,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS &amp;#8216;上月第一天&amp;#8217;&lt;br /&gt; &amp;#8211;简化&lt;br /&gt; SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)-1,0) AS &amp;#8216;上月第一天&amp;#8217;&lt;br /&gt; &amp;#8211;另一种当前月第一天算法&lt;br /&gt; SELECT DATEADD(MONTH,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) &amp;#8216;上月第一天&amp;#8217;&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;计算给定日期所在月的上月最后一天&lt;br /&gt; DECLARE @Date&amp;nbsp; DATETIME&lt;br /&gt; SET @Date=GETDATE()&lt;br /&gt; &amp;#8211;当前月第一天减去一天&lt;br /&gt; SELECT DATEADD(DAY,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS &amp;#8216;上月最后一天&amp;#8217;&lt;br /&gt; &amp;#8211;另一种当前月第一天算法&lt;br /&gt; SELECT DATEADD(DAY,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) &amp;#8216;上月最后一天&amp;#8217;&lt;br /&gt; SELECT DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)-1 &amp;#8216;上月最后一天&amp;#8217;&lt;br /&gt; &amp;#8211;另一种算法，不能用当前月的最后一天加一个月，因为当前月可能是30天。&lt;br /&gt; &amp;#8211;例如 SELECT DATEADD(MONTH,1,&amp;#8217;2010-06-30&amp;#8242;) &amp;#8211;结果是2010-07-30而不是2010-07-31，&lt;br /&gt; &amp;#8211;这也是月末算法采用下月第一天减1天计算的原因&lt;br /&gt; &amp;#8211;但是如果计算月是31天择无此问题&lt;br /&gt; &amp;#8211;例如 SELECT DATEADD(MONTH,1,&amp;#8217;2010-05-31&amp;#8242;) &amp;#8211;结果是2010-06-30&lt;br /&gt; &amp;#8211;因此下面算法是正确的，-1 表示&amp;#8217;1899-12-31 00:00:00.000&amp;#8242;&amp;#8211; SELECT CONVERT(DATETIME,-1)&lt;br /&gt; SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date)-1,-1)&lt;br /&gt; &amp;#8211;另一种当前月算法&lt;br /&gt; SELECT DATEADD(DAY,-1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) &amp;#8216;上月最后一天&amp;#8217;&lt;br /&gt; &amp;#8211;简化&lt;br /&gt; SELECT DATEADD(DAY,0-DATEPART(DAY,@Date),@Date) &amp;#8216;上月最后一天&amp;#8217;&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;计算给定日期所在月的下月第一天&lt;br /&gt; DECLARE @Date&amp;nbsp; DATETIME&lt;br /&gt; SET @Date=GETDATE()&lt;br /&gt; &amp;#8211;当前月第一天加一个月&lt;br /&gt; SELECT DATEADD(MONTH,1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0)) AS &amp;#8216;下月第一天&amp;#8217;&lt;br /&gt; &amp;#8211;简化&lt;br /&gt; SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+1,0) AS &amp;#8216;下月第一天&amp;#8217;&lt;br /&gt; &amp;#8211;另一种当前月第一天算法&lt;br /&gt; SELECT DATEADD(MONTH,1,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date)) &amp;#8216;下月第一天&amp;#8217;&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;计算给定日期所在月的下月最后一天&lt;br /&gt; DECLARE @Date&amp;nbsp; DATETIME&lt;br /&gt; SET @Date=GETDATE()&lt;br /&gt; &amp;#8211;当前月第一天加2个月再减去1天&lt;br /&gt; SELECT DATEADD(DAY,-1,DATEADD(MONTH,2,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0))) AS &amp;#8216;下月最后一天&amp;#8217;&lt;br /&gt; &amp;#8211;简化&lt;br /&gt; SELECT DATEADD(DAY,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+2,0)) AS &amp;#8216;下月最后一天&amp;#8217;&lt;br /&gt; SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,@Date)+2,0)-1 AS &amp;#8216;下月最后一天&amp;#8217;&lt;br /&gt; &amp;#8211;另一种算法&lt;br /&gt; SELECT DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date)+1,-1) &amp;#8216;下月最后一天&amp;#8217;&lt;br /&gt; &amp;#8211;另一种当前月第一天算法&lt;br /&gt; SELECT DATEADD(DAY,-1,DATEADD(MONTH,2,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date))) &amp;#8216;下月最后一天&amp;#8217;&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;所在星期的第一天，计算给定日期所在星期的第1天(星期日为第一天)&lt;br /&gt; DECLARE @Date&amp;nbsp; DATETIME&lt;br /&gt; SET @Date= GETDATE()&lt;br /&gt; &amp;#8211;与SQL Server语言版本相关的算法&lt;br /&gt; &amp;#8211;思路：当前日期+星期日(每周的第1天)与当前日期的差的天数&lt;br /&gt; &amp;#8211;DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关&lt;br /&gt; SET DATEFIRST 7 &amp;#8212; 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)&lt;br /&gt; SELECT DATEADD(WEEKDAY,1-DATEPART(WEEKDAY,@Date),@Date) AS &amp;#8216;所在星期的第一天，星期日&amp;#8217;&lt;br /&gt; &amp;#8211;星期日，与SQL Server语言版本或@@DATEFIRST无关&lt;br /&gt; &amp;#8211;&amp;#8217;1989-12-31&amp;#8242; 是星期日，&amp;#8217;1989-12-31&amp;#8242; 再加上(当前日期与1989-12-31差的星期数)个星期&lt;br /&gt; SELECT DATEADD(WEEK,DATEDIFF(WEEK,-1,@Date),-1) AS &amp;#8216;所在星期的星期日&amp;#8217;&lt;br /&gt; &amp;#8211;或者&lt;br /&gt; SELECT DATEADD(WEEK,DATEDIFF(WEEK,6,@Date),6) AS &amp;#8216;所在星期的星期日&amp;#8217;&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;所在星期的第二天，计算给定日期所在星期的第2天(星期日为第一天)&lt;br /&gt; DECLARE @Date&amp;nbsp; DATETIME&lt;br /&gt; SET @Date= GETDATE()&lt;br /&gt; &amp;#8211;思路：当前日期+星期一(每周的第2天)与当前日期的差的天数&lt;br /&gt; &amp;#8211;DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关&lt;br /&gt; SET DATEFIRST 7 &amp;#8212; 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)&lt;br /&gt; SELECT DATEADD(DAY,2-DATEPART(WEEKDAY,@Date),@Date) AS &amp;#8216;所在星期的第二天，星期一&amp;#8217;&lt;br /&gt; &amp;#8211;星期一，与SQL Server语言版本或@@DATEFIRST无关&lt;br /&gt; &amp;#8211;&amp;#8217;1900-01-01&amp;#8242; 是星期一，&amp;#8217;1900-01-01&amp;#8242; 再加上(当前日期与1900-01-01差的星期数)个星期&lt;br /&gt; SELECT DATEADD(WEEK,DATEDIFF(WEEK,0,@Date),0) AS &amp;#8216;所在星期的星期一&amp;#8217;&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;上个星期第一天，计算给定日期所在星期的上一个星期日(星期日为第一天)&lt;br /&gt; DECLARE @Date&amp;nbsp; DATETIME&lt;br /&gt; SET @Date= GETDATE()&lt;br /&gt; &amp;#8211;思路：当前日志所在星期的星期日再减1周&lt;br /&gt; &amp;#8211;DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关&lt;br /&gt; SET DATEFIRST 7 &amp;#8212; 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)&lt;br /&gt; SELECT DATEADD(WEEK,-1,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS &amp;#8216;上个星期第一天，星期日&amp;#8217;&lt;br /&gt; &amp;#8211;一周等于7天&lt;br /&gt; SELECT DATEADD(DAY,-7,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS &amp;#8216;上个星期第一天，星期日&amp;#8217;&lt;br /&gt; &amp;#8211;简化&lt;br /&gt; SELECT DATEADD(DAY,-6-DATEPART(WEEKDAY,@Date),@Date) AS &amp;#8216;上个星期第一天，星期日&amp;#8217;&lt;br /&gt; &amp;#8211;上个星期日，与SQL Server语言版本或@@DATEFIRST无关&lt;br /&gt; SELECT DATEADD(WEEK,-1+DATEDIFF(WEEK,-1,@Date),-1) AS &amp;#8216;上个星期日&amp;#8217;&lt;br /&gt; &amp;#8211;或者&lt;br /&gt; SELECT DATEADD(WEEK,DATEDIFF(WEEK,6,@Date),-1) AS &amp;#8216;上个星期日&amp;#8217;&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;下个星期第一天，计算给定日期所在星期的下一个星期日(星期日为第一天)&lt;br /&gt; DECLARE @Date&amp;nbsp; DATETIME&lt;br /&gt; SET @Date= GETDATE()&lt;br /&gt; &amp;#8211;思路：当前日志所在星期的星期日再加1周&lt;br /&gt; &amp;#8211;DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关&lt;br /&gt; SET DATEFIRST 7 &amp;#8212; 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)&lt;br /&gt; SELECT DATEADD(WEEK,1,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS &amp;#8216;下个星期第一天，星期日&amp;#8217;&lt;br /&gt; &amp;#8211;一周等于7天&lt;br /&gt; SELECT DATEADD(DAY,7,DATEADD(DAY,1-DATEPART(WEEKDAY,@Date),@Date)) AS &amp;#8216;下个星期第一天，星期日&amp;#8217;&lt;br /&gt; &amp;#8211;简化&lt;br /&gt; SELECT DATEADD(DAY,8-DATEPART(WEEKDAY,@Date),@Date) AS &amp;#8216;下个星期第一天，星期日&amp;#8217;&lt;br /&gt; &amp;#8211;下个星期日，与SQL Server语言版本或@@DATEFIRST无关&lt;br /&gt; SELECT DATEADD(WEEK,1+DATEDIFF(WEEK,-1,@Date),-1) AS &amp;#8216;下个星期日&amp;#8217;&lt;br /&gt; &amp;#8211;或者&lt;br /&gt; SELECT DATEADD(WEEK,DATEDIFF(WEEK,-1,@Date),6) AS &amp;#8216;下个星期日&amp;#8217;&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;判断给定日期是星期几&lt;br /&gt; DECLARE @Date&amp;nbsp; DATETIME&lt;br /&gt; SET @Date= GETDATE()&lt;br /&gt; &amp;#8211;DATEPART(WEEKDAY,DATE)的返回值与@@DATEFIRST相关&lt;br /&gt; SET DATEFIRST 7 &amp;#8212; 或者设置为美国英语SET LANGUAGE us_english; (星期日为第一天)&lt;br /&gt; SELECT DATEPART(WEEKDAY,@Date) &amp;#8211;返回值 1-星期日，2-星期一，3-星期二&amp;#8230;&amp;#8230;7-星期六&lt;br /&gt; &amp;#8211;上面算法与SQL 语言版本或 @@DATEFIRST 相关&lt;br /&gt; &amp;#8211;下面算法与SQL Server语言版本或@@DATEFIRST无关&lt;br /&gt; SELECT DATENAME(WEEKDAY,@Date) &amp;#8216;星期&amp;#8217;&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;年度计算&lt;br /&gt; DECLARE @Date&amp;nbsp; DATETIME&lt;br /&gt; SET @Date=GETDATE()&lt;br /&gt; &amp;#8211;年初，计算给定日期所在年的第一天&lt;br /&gt; SELECT DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0) AS &amp;#8216;所在年的第一天&amp;#8217;&lt;br /&gt; &amp;#8211;年末，计算给定日期所在年的最后一天&lt;br /&gt; SELECT DATEADD(YEAR,DATEDIFF(YEAR,-1,@Date),-1) AS &amp;#8216;所在年的最后一天&amp;#8217;&lt;br /&gt; &amp;#8211;上一年年初，计算给定日期所在年的上一年的第一天&lt;br /&gt; SELECT DATEADD(YEAR,DATEDIFF(YEAR,-0,@Date)-1,0) AS &amp;#8216;所在年的上一年的第一天&amp;#8217;&lt;br /&gt; &amp;#8211;上一年年末，计算给定日期所在年的上一年的最后一天&lt;br /&gt; SELECT DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),-1) AS &amp;#8216;所在年的上一年的最后一天&amp;#8217;&lt;br /&gt; &amp;#8211;下一年年初，计算给定日期所在年的下一年的第一天&lt;br /&gt; SELECT DATEADD(YEAR,1+DATEDIFF(YEAR,0,@Date),0) AS &amp;#8216;所在年的下一年的第一天&amp;#8217;&lt;br /&gt; &amp;#8211;下一年年末，计算给定日期所在年的下一年的最后一天&lt;br /&gt; SELECT DATEADD(YEAR,1+DATEDIFF(YEAR,-1,@Date),-1) AS &amp;#8216;所在年的下一年的最后一天&amp;#8217;&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;季度计算&lt;br /&gt; DECLARE @Date&amp;nbsp; DATETIME&lt;br /&gt; SET @Date=GETDATE()&lt;br /&gt; &amp;#8211;季度初，计算给定日期所在季度的第一天&lt;br /&gt; SELECT DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),0) AS &amp;#8216;当前季度的第一天&amp;#8217;&lt;br /&gt; &amp;#8211;季度末，计算给定日期所在季度的最后一天&lt;br /&gt; SELECT DATEADD(QUARTER,1+DATEDIFF(QUARTER,0,@Date),-1) AS &amp;#8216;当前季度的最后一天&amp;#8217;&lt;br /&gt; &amp;#8211;上个季度初&lt;br /&gt; SELECT DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date)-1,0) AS &amp;#8216;当前季度的上个季度初&amp;#8217;&lt;br /&gt; &amp;#8211;上个季度末&lt;br /&gt; SELECT DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),-1) AS &amp;#8216;当前季度的上个季度末&amp;#8217;&lt;br /&gt; &amp;#8211;下个季度初&lt;br /&gt; SELECT DATEADD(QUARTER,1+DATEDIFF(QUARTER,0,@Date),0) AS &amp;#8216;当前季度的下个季度初&amp;#8217;&lt;br /&gt; &amp;#8211;下个季度末&lt;br /&gt; SELECT DATEADD(QUARTER,2+DATEDIFF(QUARTER,0,@Date),-1) AS &amp;#8216;当前季度的下个季度末&amp;#8217;&lt;br /&gt; GO&lt;br /&gt; &amp;#8211;计算给定日期所在月的天数&lt;br /&gt; DECLARE @Date DATETIME;&lt;br /&gt; SET @Date = GETDATE()&lt;br /&gt; &amp;#8211;本月度第一天与下月度第一天所差的天数&lt;br /&gt; SELECT DATEDIFF(DAY,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0),DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Date),0))&lt;br /&gt; &amp;#8211;借助变量简化&lt;br /&gt; SELECT @Date = DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0) &amp;#8211;本月度第一天&lt;br /&gt; SELECT DATEDIFF(DAY,@Date,DATEADD(MONTH,1,@Date))&lt;br /&gt; &amp;#8211;另一种思路：给定月最后一天的日期，记为本月天数&lt;br /&gt; SELECT DAY(DATEADD(MONTH,DATEDIFF(MONTH,-1,@Date),-1))&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;计算给定日期所在季度的天数&lt;br /&gt; DECLARE @Date DATETIME;&lt;br /&gt; SET @Date = GETDATE()&lt;br /&gt; &amp;#8211;本季度第一天与下季度第一天所差的天数&lt;br /&gt; SELECT DATEDIFF(DAY,DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),0),DATEADD(QUARTER,1+DATEDIFF(QUARTER,0,@Date),0))&lt;br /&gt; &amp;#8211;借助变量简化&lt;br /&gt; SELECT @Date = DATEADD(QUARTER,DATEDIFF(QUARTER,0,@Date),0) &amp;#8211;本季度第一天&lt;br /&gt; SELECT DATEDIFF(DAY,@Date,DATEADD(QUARTER,1,@Date))&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;计算给定日期所在年度的天数&lt;br /&gt; DECLARE @Date DATETIME;&lt;br /&gt; SET @Date = GETDATE()&lt;br /&gt; &amp;#8211;本年度第一天与下年度第一天所差的天数&lt;br /&gt; SELECT DATEDIFF(DAY,DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0),DATEADD(YEAR,1+DATEDIFF(YEAR,0,@Date),0))&lt;br /&gt; &amp;#8211;借助变量简化&lt;br /&gt; SELECT @Date = DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0) &amp;#8211;本年度第一天&lt;br /&gt; SELECT DATEDIFF(DAY,@Date,DATEADD(YEAR,1,@Date))&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;判断给定日期所在年是否闰年&lt;br /&gt; &amp;#8211;根据全年总天数判断&lt;br /&gt; DECLARE @Date DATETIME;&lt;br /&gt; SET @Date = GETDATE()&lt;br /&gt; SELECT CASE DATEDIFF(DAY,DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),0),DATEADD(YEAR,1+DATEDIFF(YEAR,0,@Date),0))&lt;br /&gt; &amp;nbsp; WHEN 365 THEN &amp;#8216;平年&amp;#8217; ELSE &amp;#8216;闰年&amp;#8217; END&lt;br /&gt; &amp;#8211;根据二月天数判断&lt;br /&gt; &amp;#8211;给日期的上一年最后一天加2个月，即为当年2月最后一天&lt;br /&gt; SELECT CASE DAY(DATEADD(MONTH,2,DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),-1))) WHEN 28 THEN &amp;#8216;平年&amp;#8217; ELSE &amp;#8216;闰年&amp;#8217; END&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;计算给定日期是当年的第几天&lt;br /&gt; DECLARE @Date DATETIME;&lt;br /&gt; SET @Date = GETDATE()&lt;br /&gt; SELECT DATEPART(DAYOFYEAR,@Date) [DayOfYear];&lt;br /&gt; SELECT DATENAME(DAYOFYEAR,@Date)&amp;nbsp; [DayOfYear];&lt;br /&gt; &amp;#8211;另一种思路：当前日期与上年最后一天差的天数&lt;br /&gt; SELECT DATEDIFF(DAY,DATEADD(YEAR,DATEDIFF(YEAR,0,@Date),-1),@Date)[DayOfYear]&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;计算给定日期是当年的第几周&lt;br /&gt; DECLARE @Date DATETIME;&lt;br /&gt; SET @Date = GETDATE()&lt;br /&gt; SELECT DATEPART(WEEK,@Date) [WeekOfYear]; &amp;#8211;返回int型&lt;br /&gt; SELECT DATENAME(WEEK,@Date) [WeekOfYear]; &amp;#8211;返回varchar型&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;计算给定日期是当年的第几月&lt;br /&gt; DECLARE @Date DATETIME;&lt;br /&gt; SET @Date = GETDATE()&lt;br /&gt; SELECT DATEPART(MONTH,@Date) [MonthOfYear]; &amp;#8211;返回int型&lt;br /&gt; SELECT DATENAME(MONTH,@Date) [MonthOfYear]; &amp;#8211;返回varchar型&lt;br /&gt; SELECT MONTH(@Date) [MonthOfYear];&amp;#8211;返回int型&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;计算给定日期是当年的第几季度&lt;br /&gt; DECLARE @Date DATETIME;&lt;br /&gt; SET @Date = GETDATE()&lt;br /&gt; SELECT DATEPART(QUARTER,@Date) [QuarterOfYear]; &amp;#8211;返回int型&lt;br /&gt; SELECT DATENAME(QUARTER,@Date) [QuarterOfYear]; &amp;#8211;返回varchar型&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;计算给定日期是当月的第几周&lt;br /&gt; DECLARE @Date DATETIME;&lt;br /&gt; SET @Date = GETDATE()&lt;br /&gt; &amp;#8211;思路，给定日期是当年的第几周-给定日期所在月第一天是当年的第几周&lt;br /&gt; SELECT DATEPART(WEEK,@Date)-DATEPART(WEEK,DATEADD(MONTH,DATEDIFF(MONTH,0,@Date),0))+1 [WeekOfMonth]&lt;br /&gt; SELECT DATEPART(WEEK,@Date)-DATEPART(WEEK,DATEADD(DAY,1-DATEPART(DAY,@Date),@Date))+1 [WeekOfMonth]&lt;br /&gt; GO&lt;/p&gt; &lt;p&gt;&amp;#8211;计算给定日期所在月的第一个星期一是哪天&lt;br /&gt; DECLARE @Date DATETIME;&lt;br /&gt; SET @Date = GETDATE()&lt;br /&gt; &amp;#8211;思路，1900-01-01(星期一)加上(给定日志所在月的月6号与1900-01-01差的周数)个周&lt;br /&gt; &amp;#8211;为什么不选7号？如果是7号，那么7好恰好是星期日的话，第一个周一就会算到8号。&lt;br /&gt; &amp;#8211;为什么不选5号？如果5号是星期六，那么周一就跑到上月了。小于5号与这个道理一样。&lt;br /&gt; SELECT DATEADD(WEEK,DATEDIFF(WEEK,0,DATEADD(DAY,6-DATEPART(DAY,@Date),@Date)),0) &amp;#8216;所在月的第一个星期一&amp;#8217;&lt;br /&gt; SELECT DATEADD(WEEK,DATEDIFF(WEEK,0,DATEADD(DAY,6-DATEPART(DAY,@Date),@Date)),7) &amp;#8216;所在月的第二个星期一&amp;#8217;&lt;br /&gt; SELECT DATEADD(WEEK,DATEDIFF(WEEK,0,DATEADD(DAY,6-DATEPART(DAY,@Date),@Date)),1) &amp;#8216;所在月的第一个星期二&amp;#8217;&lt;br /&gt; SELECT DATEADD(WEEK,DATEDIFF(WEEK,0,DATEADD(DAY,6-DATEPART(DAY,@Date),@Date)),8) &amp;#8216;所在月的第二个星期二&amp;#8217;&lt;br /&gt; GO&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/luohoufu/aggbug/1951155.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/luohoufu/archive/2011/02/11/1951155.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/luohoufu/archive/2010/06/03/1750946.html</id><title type="text">sql server 2008 CDC</title><summary type="text">此文章基于SQL Server 2008 CTP3 (Jun 04, 2007)。 change data capture是在每次对数据库执行insert、update、delete操作的时候，捕获变更数据的方法，这在数据仓库中是常用到的技术手段。Oracle早在9i中就加入了这一特性，在多年后的今天，SQL Server总算是提供了同样的功能。CDC的原理是每次对源表（Source Tables...</summary><published>2010-06-03T09:48:00Z</published><updated>2010-06-03T09:48:00Z</updated><author><name>Robert.H.fu</name><uri>http://www.cnblogs.com/luohoufu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luohoufu/archive/2010/06/03/1750946.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luohoufu/archive/2010/06/03/1750946.html"/><content type="text">此文章基于SQL Server 2008 CTP3 (Jun 04, 2007)。 change data capture是在每次对数据库执行insert、update、delete操作的时候，捕获变更数据的方法，这在数据仓库中是常用到的技术手段。Oracle早在9i中就加入了这一特性，在多年后的今天，SQL Server总算是提供了同样的功能。CDC的原理是每次对源表（Source Tables...</content></entry><entry><id>http://www.cnblogs.com/luohoufu/archive/2010/06/01/1748890.html</id><title type="text">sql server &amp;amp; excel</title><summary type="text">二、SQL SERVER 和EXCEL的数据导入导出1、在SQL SERVER里查询Excel数据:-- ======================================================SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="c:\book1.xls";User ID=A...</summary><published>2010-06-01T02:36:00Z</published><updated>2010-06-01T02:36:00Z</updated><author><name>Robert.H.fu</name><uri>http://www.cnblogs.com/luohoufu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luohoufu/archive/2010/06/01/1748890.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luohoufu/archive/2010/06/01/1748890.html"/><content type="text">二、SQL SERVER 和EXCEL的数据导入导出1、在SQL SERVER里查询Excel数据:-- ======================================================SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="c:\book1.xls";User ID=A...</content></entry><entry><id>http://www.cnblogs.com/luohoufu/archive/2009/10/21/1587293.html</id><title type="text">保持一颗好学之心</title><summary type="text">保持一颗好学之心 初见这个题目，许多人可能会对自己相当满意：“我还是很好学的”。真的是这样吗？个人之见，有不少人其实并不像他们想象的那么好学，尤其是那些有了一定经验，在某些方面有些过人之处的“聪明”之人，随着技术水平和自信心的积累，往往丢失了好学之心，而他们自己却浑然不知。对此，去年Infoq刊登的一片新闻《初心，聆听之术》谈到了如何保持学习心态的...</summary><published>2009-10-21T01:55:00Z</published><updated>2009-10-21T01:55:00Z</updated><author><name>Robert.H.fu</name><uri>http://www.cnblogs.com/luohoufu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luohoufu/archive/2009/10/21/1587293.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luohoufu/archive/2009/10/21/1587293.html"/><content type="text">保持一颗好学之心 初见这个题目，许多人可能会对自己相当满意：“我还是很好学的”。真的是这样吗？个人之见，有不少人其实并不像他们想象的那么好学，尤其是那些有了一定经验，在某些方面有些过人之处的“聪明”之人，随着技术水平和自信心的积累，往往丢失了好学之心，而他们自己却浑然不知。对此，去年Infoq刊登的一片新闻《初心，聆听之术》谈到了如何保持学习心态的...</content></entry><entry><id>http://www.cnblogs.com/luohoufu/archive/2009/04/29/1446601.html</id><title type="text">log4net 配置</title><summary type="text">log4net, 是 apache.org 在 log4j的基础上推出的针对.NET程序的开源的日志组件。log4net目前的最新版本是 1.2.10，log4net支持的日志保存方式，可谓丰富之极，包括： 存入SQL SERVER 数据库 存入ACCESS数据库 存入ORACLE数据库 存入DB2数据库 存入SQLLite数据库 生成asp.net 的trace模式的日志 缓存方式的日志 直接输...</summary><published>2009-04-29T15:29:00Z</published><updated>2009-04-29T15:29:00Z</updated><author><name>Robert.H.fu</name><uri>http://www.cnblogs.com/luohoufu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luohoufu/archive/2009/04/29/1446601.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luohoufu/archive/2009/04/29/1446601.html"/><content type="text">log4net, 是 apache.org 在 log4j的基础上推出的针对.NET程序的开源的日志组件。log4net目前的最新版本是 1.2.10，log4net支持的日志保存方式，可谓丰富之极，包括： 存入SQL SERVER 数据库 存入ACCESS数据库 存入ORACLE数据库 存入DB2数据库 存入SQLLite数据库 生成asp.net 的trace模式的日志 缓存方式的日志 直接输...</content></entry><entry><id>http://www.cnblogs.com/luohoufu/archive/2008/10/13/1310412.html</id><title type="text">在ubuntu 下安装Oracle 11g</title><summary type="text">$ sudo su -# apt-get install build-essential libaio1 gawk ksh libmotif3 alien libtool lsb-rpmroot@hardy:~# cd /binroot@hardy:/bin# ls -l /bin/shlrwxrwxrwx 1 root root 4 2008-04-28 19:59 /bin/sh -&gt; ...</summary><published>2008-10-13T15:14:00Z</published><updated>2008-10-13T15:14:00Z</updated><author><name>Robert.H.fu</name><uri>http://www.cnblogs.com/luohoufu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luohoufu/archive/2008/10/13/1310412.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luohoufu/archive/2008/10/13/1310412.html"/><content type="text">$ sudo su -# apt-get install build-essential libaio1 gawk ksh libmotif3 alien libtool lsb-rpmroot@hardy:~# cd /binroot@hardy:/bin# ls -l /bin/shlrwxrwxrwx 1 root root 4 2008-04-28 19:59 /bin/sh -&gt; ...</content></entry><entry><id>http://www.cnblogs.com/luohoufu/archive/2008/10/12/1308918.html</id><title type="text">在oracle中使用自增字段 </title><summary type="text">在oracle中使用自增字段大家都知道,oracle是不支持auto_increment字段的,但可以通过创建Sequence对象来使用自增序列,语法是:SQL代码 createsequenceSEQ_SUBS_ID incrementby1 startwith1 maxvalue10000000000 nocycle;其中SEQ_SUBS_ID为序列名,increment by 1表示步长为1,...</summary><published>2008-10-12T00:18:00Z</published><updated>2008-10-12T00:18:00Z</updated><author><name>Robert.H.fu</name><uri>http://www.cnblogs.com/luohoufu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luohoufu/archive/2008/10/12/1308918.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luohoufu/archive/2008/10/12/1308918.html"/><content type="text">在oracle中使用自增字段大家都知道,oracle是不支持auto_increment字段的,但可以通过创建Sequence对象来使用自增序列,语法是:SQL代码 createsequenceSEQ_SUBS_ID incrementby1 startwith1 maxvalue10000000000 nocycle;其中SEQ_SUBS_ID为序列名,increment by 1表示步长为1,...</content></entry><entry><id>http://www.cnblogs.com/luohoufu/archive/2008/10/05/1304321.html</id><title type="text">今年国庆过得特别快</title><summary type="text">又是一年国庆,参加工作一年后,是该认认真真过过国庆了,以前都没有认真考虑自己该如何过好国庆,一个人过也没多大意思,国庆前打电话给以前的同学,可她们一个个都来不了.倒是我堂哥和伯母想到北京来玩.正好我也闲着没什么事,反正一个人也不好玩嘛,就陪他们一直在北京玩几天.说实在的,黄金周在北京玩实在不咋的,游客太多了,每去一个景点都是人山人海的,每天都要坐车,地铁,走路也挺折腾人的.第二天,我们去了长城,由...</summary><published>2008-10-05T13:26:00Z</published><updated>2008-10-05T13:26:00Z</updated><author><name>Robert.H.fu</name><uri>http://www.cnblogs.com/luohoufu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luohoufu/archive/2008/10/05/1304321.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luohoufu/archive/2008/10/05/1304321.html"/><content type="text">又是一年国庆,参加工作一年后,是该认认真真过过国庆了,以前都没有认真考虑自己该如何过好国庆,一个人过也没多大意思,国庆前打电话给以前的同学,可她们一个个都来不了.倒是我堂哥和伯母想到北京来玩.正好我也闲着没什么事,反正一个人也不好玩嘛,就陪他们一直在北京玩几天.说实在的,黄金周在北京玩实在不咋的,游客太多了,每去一个景点都是人山人海的,每天都要坐车,地铁,走路也挺折腾人的.第二天,我们去了长城,由...</content></entry><entry><id>http://www.cnblogs.com/luohoufu/archive/2008/09/24/1298353.html</id><title type="text">J2EE中的13种技术规范 </title><summary type="text">J2EE平台由一整套服务（Services）、应用程序接口（APIs）和协议构成，它对开发基于Web的多层应用提供了功能支持，下面对J2EE中的13种技术规范进行简单的描述(限于篇幅，这里只能进行简单的描述): 1.JDBC(Java Database Connectivity): JDBC API为访问不同的数据库提供了一种统一的途径，象ODBC一样，JDBC对开发者屏蔽了一些细节问题，另外，...</summary><published>2008-09-24T13:54:00Z</published><updated>2008-09-24T13:54:00Z</updated><author><name>Robert.H.fu</name><uri>http://www.cnblogs.com/luohoufu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/luohoufu/archive/2008/09/24/1298353.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/luohoufu/archive/2008/09/24/1298353.html"/><content type="text">J2EE平台由一整套服务（Services）、应用程序接口（APIs）和协议构成，它对开发基于Web的多层应用提供了功能支持，下面对J2EE中的13种技术规范进行简单的描述(限于篇幅，这里只能进行简单的描述): 1.JDBC(Java Database Connectivity): JDBC API为访问不同的数据库提供了一种统一的途径，象ODBC一样，JDBC对开发者屏蔽了一些细节问题，另外，...</content></entry></feed>
