模拟实现SQL Server中的datepart(week,date)的功能
IF OBJECT_ID(N'dbo.ufn_FirstDayOfYear', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_FirstDayOfYear;
END
GO --==================================
-- 功能:获取指定日期所在当前年的第一天
-- 说明:具体功能说明
-- 兼容:运行SQL Server 2005+
-- 创建:2016-07-06 09:00-09:05 剑走江湖 创建实现
-- 修改:yyyy-MM-dd hh:mm-hh:mm XXX 修改内容描述
--==================================
CREATE FUNCTION dbo.ufn_FirstDayOfYear
(
@dtmDate AS DATETIME --指定日期
) RETURNS DATETIME
AS
BEGIN
RETURN DATEADD(YEAR, DATEDIFF(YEAR, 0, @dtmDate), 0);
END
GO IF OBJECT_ID(N'dbo.ufn_FirstWeekFirstDayOfYear', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_FirstWeekFirstDayOfYear;
END
GO --==================================
-- 功能:获取指定日期所在当前年的第一周的第一天
-- 说明:可以通过参数@tntDateFirst动态指定一周开始的第一天,类似全局变量@@DATEFIRST的值且保持一致
-- 兼容:运行SQL Server 2005+
-- 创建:2016-07-06 09:05-09:15 剑走江湖 创建实现
-- 修改:yyyy-MM-dd hh:mm-hh:mm XXX 修改内容描述
--==================================
CREATE FUNCTION dbo.ufn_FirstWeekFirstDayOfYear
(
@dtmDate AS DATETIME --指定日期
,@tntDateFirst AS TINYINT = 1 --第一天日期(从1、2、3、……、7分别对应周一、周二、周三、……、周日)
) RETURNS DATETIME
AS
BEGIN
IF (@tntDateFirst IS NULL OR @tntDateFirst = 0 OR @tntDateFirst NOT BETWEEN 1 AND 7)
BEGIN
SET @tntDateFirst = 1;
END DECLARE @dtmFirstWeekFirstDayOfYear AS DATETIME;
SET @dtmFirstWeekFirstDayOfYear = 0; DECLARE
@dtmFirstDayOfYear AS DATETIME
,@dtmStartDate AS DATETIME
,@dtmEndDate AS DATETIME;
SELECT
@dtmFirstDayOfYear = [dbo].[ufn_FirstDayOfYear](@dtmDate)
,@dtmStartDate = @dtmFirstDayOfYear
,@dtmEndDate = DATEADD(DAY, 7, @dtmStartDate); WHILE (@dtmStartDate <= @dtmEndDate)
BEGIN
IF ([dbo].[ufn_DayOfWeek](@dtmStartDate) = @tntDateFirst)
BEGIN
SET @dtmFirstWeekFirstDayOfYear = @dtmStartDate; BREAK;
END SET @dtmStartDate = DATEADD(DAY, 1, @dtmStartDate);
END RETURN @dtmFirstWeekFirstDayOfYear;
END
GO IF OBJECT_ID(N'dbo.ufn_DayOfWeek', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_DayOfWeek;
END
GO --==================================
-- 功能: 获取指定日期时间的所在当前周的日索引值(索引值从1开始计数,依次为1、2、……、7)
-- 说明: 运行在SQL Server 2005+。
-- 结果值从1到7,分别对应从周一到周日,该值与@@DATEFISRT配置函数值保持一致。
-- 使用(@@datefirst + datepart(weekday, @dtmDate))%7的结果值从2、3、4、5、6、0、1
-- 分别对应周一、周二、周三、周四、周五、周六、周日。
-- 兼容:运行SQL Server 2005+
-- 创建:2016-01-02 hh:mm-hh:mm 剑走江湖 创建实现
-- 修改:yyyy-MM-dd hh:mm-hh:mm XXX 修改内容描述
-- 调用: SELECT dbo.ufn_DayOfWeek('2017-01-07') -- 4(表示星期四)
--==================================
CREATE FUNCTION dbo.ufn_DayOfWeek
(
@dtmDate AS DATETIME -- 指定的日期时间
) RETURNS TINYINT
--$Encode$--
BEGIN
DECLARE @tntRemainder AS TINYINT;
SET @tntRemainder = (@@DATEFIRST + DATEPART(WEEKDAY, @dtmDate)) % 7; RETURN (CASE WHEN @tntRemainder <= 1 THEN @tntRemainder + 6 ELSE @tntRemainder - 1 END);
END
GO IF OBJECT_ID(N'dbo.ufn_WeekOfYear', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_WeekOfYear;
END
GO --==================================
-- 功能:获取指定日期所在当前年的星期索引值(索引值从1开始计数,依次为1、2、……、51、52、53、54)
-- 说明:具体功能说明
-- 兼容:运行SQL Server 2005+
-- 创建:2016-07-06 09:15-09:35 剑走江湖 创建实现
-- 修改:yyyy-MM-dd hh:mm-hh:mm XXX 修改内容描述
--==================================
CREATE FUNCTION dbo.ufn_WeekOfYear
(
@dtmDate AS DATETIME --指定日期
,@tntDateFirst AS TINYINT = 1 --第一天日期(从1、2、3、……、7分别对应周一、周二、周三、……、周日)
) RETURNS TINYINT
AS
BEGIN
DECLARE @tntWeekOfYear AS TINYINT;
SET @tntWeekOfYear = 1; DECLARE
@dtmFirstDayOfYear AS DATETIME
,@dtmFirstWeekFirstDayOfYear AS DATETIME;
SELECT
@dtmFirstDayOfYear = dbo.[ufn_FirstDayOfYear](@dtmDate)
,@dtmFirstWeekFirstDayOfYear = dbo.[ufn_FirstWeekFirstDayOfYear](@dtmDate, @tntDateFirst); IF NOT(@dtmDate >= @dtmFirstDayOfYear AND @dtmDate < @dtmFirstWeekFirstDayOfYear)
BEGIN
SET @tntWeekOfYear = @tntWeekOfYear + DATEDIFF(DAY, @dtmFirstWeekFirstDayOfYear, @dtmDate) / 7; IF @dtmFirstDayOfYear < @dtmFirstWeekFirstDayOfYear
BEGIN
SET @tntWeekOfYear = @tntWeekOfYear + 1;
END
END RETURN @tntWeekOfYear;
END
GO
DECLARE
@tntDateFirst AS TINYINT
,@tntMaxDateFirst AS TINYINT
,@dtmStartDate AS DATETIME
,@dtmEndDate AS DATETIME;
SELECT
@tntDateFirst = 1
,@tntMaxDateFirst = 7
,@dtmStartDate = '2000-01-01'
,@dtmEndDate = '2000-01-07';
WHILE (@tntDateFirst <= @tntMaxDateFirst)
BEGIN
SELECT
[T2].[FullDate]
,[T2].[DayOfWeek]
,[T2].[FirstWeekFirstDayOfYear]
,@tntDateFirst AS [FirstDateOfWeek]
,[T2].[WeekOfYear]
,COUNT(T2.[FullDate]) OVER (PARTITION BY YEAR(T2.[FullDate]), T2.[WeekOfYear]) AS DayCountOfWeek
,T2.[DefaultDayOfWeek]
,@@DATEFIRST AS [DefaultFirstDateOfWeek]
,[T2].[DefaultWeekOfYear]
,COUNT(T2.[FullDate]) OVER (PARTITION BY YEAR(T2.[FullDate]), T2.[DefaultWeekOfYear]) AS DefaultDayCountOfWeek
FROM (
SELECT
T.[FullDate]
,[dbo].[ufn_DayOfWeek](T.[FullDate]) AS [DayOfWeek]
,[dbo].[ufn_FirstWeekFirstDayOfYear](T.[FullDate], @tntDateFirst) AS [FirstWeekFirstDayOfYear]
,[dbo].[ufn_WeekOfYear](T.[FullDate], @tntDateFirst) AS [WeekOfYear]
,DATEPART(WEEKDAY, T.[FullDate]) AS [DefaultDayOfWeek]
,DATEPART(WEEK, T.[FullDate]) AS [DefaultWeekOfYear]
FROM (
SELECT DATEADD(DAY, [Num], @dtmStartDate) AS FullDate
FROM [dbo].[ufn_GetNums](0, DATEDIFF(DAY, @dtmStartDate, @dtmEndDate))
) AS T
) AS T2; SET @tntDateFirst = @tntDateFirst + 1;
END
GO




模拟实现SQL Server中的datepart(week,date)的功能的更多相关文章
- SQL Server中的DATEPART函数的使用
下面文章来自:http://blog.csdn.net/hello_world_wusu/article/details/4632049 定义和用法 DATEPART() 函数用于返回日期/时间的单独 ...
- 在sql server中利用with as实现递归功能
在sqlserver2005之前,要实现递归功能比较麻烦,比如可能会要用到临时表与while语句来循环.自sqlserver2005之后,新增了with as功能语法,即 公用表达式(CTE),让递归 ...
- SQL Server中SELECT会真的阻塞SELECT吗?
在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...
- Microsoft SQL Server中的事务与并发详解
本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...
- Sql Server中查询今天、昨天、本周、上周、本月、上月数据
Sql Server中查询今天.昨天.本周.上周.本月.上月数据 在做Sql Server开发的时候有时需要获取表中今天.昨天.本周.上周.本月.上月等数据,这时候就需要使用DATEDIFF()函数及 ...
- SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
- 模拟实现SQL Server字段列显示的数据类型
本文目录列表: 1.SQL Server表设计视图中的数据类型列展示效果 2.模拟实现类似的数据类型显示效果 3.测试效果 4.总结语 5.参考清单列表 1.SQL Server表设计视图中的数据 ...
- 【转】T-SQL查询进阶—理解SQL Server中的锁
简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于大多数数据库来说是需要同时处理多个查 ...
- SQL Server中关于跟踪(Trace)那点事
前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...
随机推荐
- mac显示和隐藏文件
封装了一下显示和隐藏的脚本,方便mac上的文件隐藏和显示 if [ `defaults read com.apple.finder AppleShowAllFiles` = "1" ...
- 微软StockTrader应用程序
这是一个采用 .NET Enterprise Application Server 技术的端到端示例应用程序.应用程序代码可以从 这里 下载. 代码中演示了WCF服务和移动开发,包括用Xamarin ...
- ASP.NET MVC学前篇之扩展方法、链式编程
ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...
- 不知道张(zhāng)雱(pāng)是谁?你out了!
张(zhāng)雱(pāng)是谁?也许你已经听说过了,也许你还没听说过呢,不过你一定听说过老刘——刘强东,没错,这二人是有关系的,什么关系,京东是老刘的,而张雱呢?张雱是京东旗下52家关联公司法人代 ...
- PHP 数据访问
如何连接 1.造连接对象 $db= new MySQLi("localhost","root","123","mydb" ...
- Python学习路径及练手项目合集
Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159
- ExtJs4 基础必备
认识ExtJs的开发包 下载路径:http://www.sencha.com/products/extjs/download/ 解压有20多兆,别怕,真正运行的没这么大.认识下这个包的文件结构吧. b ...
- 【转】C# using的三种使用方法
原文地址http://www.cnblogs.com/fashui/archive/2011/09/29/2195061.html,感谢心茶前辈的总结. 1.using指令 using+命名空间,这种 ...
- css3圆形头像(当图片宽高不相等时)
1.图片宽高相等,width:300px: height:300px; 把他变成宽高100px的圆形头像 img{width:100px; height:100px; border-radius:50 ...
- MVC4做网站后台:用户管理 ——用户组
用户管理这块包含用户和用户组两部分. 用户组包括浏览 用户组列表,添加.修改.删除用户组等.按照前面思路系统是依据用户组来判断用户权限的,用户组的最主要目的是划分权限.权限这块以后单独在做. 下面实现 ...