模拟实现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数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...
随机推荐
- 天气预报API开发
天气预报API开发 一. 寻觅篇 最近想要跟着视频练习一下利用API开发一个天气预报系统,就在网上找了一下可以用的API,结果好多都已经失效了... 1. 百度车联网天气预报 ...
- 什么是jquery $ jQuery对象和DOM对象 和一些选择器
1什么是jQuery: jQuery就是将一些方法封装在一个js文件中.就是个js库 我们学习这些方法. 2为什么要学习jQuery: 原生js有以下问题: 1.兼容性问题2.代码重复3.DOM提供的 ...
- 关于MongoDB你需要知道的几件事
Henrique Lobo Weissmann是一位来自于巴西的软件开发者,他是itexto公司的联合创始人,这是一家咨询公司.近日,Henrique在博客上撰文谈到了关于MongoDB的一些内容,其 ...
- Edge.js:让.NET和Node.js代码比翼齐飞
通过Edge.js项目,你可以在一个进程中同时运行Node.js和.NET代码.在本文中,我将会论述这个项目背后的动机,并描述Edge.js提供的基本机制.随后将探讨一些Edge.js应用场景,它在这 ...
- 基于Deep Learning 的视频识别方法概览
深度学习在最近十来年特别火,几乎是带动AI浪潮的最大贡献者.互联网视频在最近几年也特别火,短视频.视频直播等各种新型UGC模式牢牢抓住了用户的消费心里,成为互联网吸金的又一利器.当这两个火碰在一起,会 ...
- 剑指Offer面试题:23.二叉树中和为某一值的路径
一.题目:二叉树中和为某一值的路径 题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.例如输入下图中二叉树和整数2 ...
- 深入浅出Alljoyn——实例分析之远程调用(Method)篇
深入浅出就是很深入的学习了很久,还是只学了毛皮,呵呵! 服务端完整代码: #include <qcc/platform.h> #include <assert.h> #incl ...
- [已招满,谢谢关注]Sogou招聘C#开发人员,有意者请进
职位名称:c#开发工程师 工作地点:搜狐网络大厦 职责:搜狗商业平台桌面产品 职位要求: 1. 计算机或者相关专业本科或以上学历 2. 精通c#,两年以上实际项目开发经验 3. 熟悉C/S开发架构和设 ...
- 花一分钟来看看Worktile是如何为团队协作而生的
团队协作,我们想的更深.更远.更多,花一分钟来看看我们特别奉献的故事,然后去注册一个账号,邀请小伙伴一起来工作,你会体会Worktile才是真正懂你的协作方式.
- SqlServer2008到期升级企业版 密钥+图解
最近使用SQL Server2008,结果Sql Server Management Studio提示过期了,如图: 遇到如上图情况,需要将SQL Server2008升级维护下,还是输入原来的密钥就 ...