模拟实现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数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...
随机推荐
- MySQL 数据库事务与复制
好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适. 最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类. 结合实际工作中碰到的问题,以寻找答案的方式 ...
- Visual Studio LightSwitch
LightSwitch是一个基于模板的自动化开发Silverlight和HTML5应用程序的工具,不同于一般的基于数据字典,配置生成的应用程序的工具,因为LightSwtich提供的所有模板都是可以扩 ...
- 关于printf错用格式化字符串导致double和long double输出错误的小随笔
[题外话] 以前用HUSTOJ给学校搭建Online Judge,所有的评测都是在Linux下进行的.后来为了好往学校服务器上部署,所以大家重新做了一套Online Judge,Web和Judge都是 ...
- ASP.NET MVC 过滤器(一)
ASP.NET MVC 过滤器(一) 前言 前面的篇幅中,了解到了控制器的生成的过程以及在生成的过程中的各种注入点,按照常理来说篇幅应该到了讲解控制器内部的执行过程以及模型绑定.验证这些知识了.但是呢 ...
- 【javascript 技巧】谈谈setTimeout的作用域以及this的指向问题
setTimeout的用法详见:http://www.w3school.com.cn/htmldom/met_win_settimeout.asp 是的,setTimeout的常见用法是让某个方法延迟 ...
- jdk1.7.0_80源码包结构
解压源码src.zip,jdk源码结构如下所示: src |--com.sun sun公司对jdk的实现,Oracle官方不支持,不保证跨平台(可能一些类linux有而windows没有),甚至 ...
- The transaction log for database 'xxxx' is full due to 'ACTIVE_TRANSACTION'
今天查看Job的History,发现Job 运行失败,错误信息是:“The transaction log for database 'xxxx' is full due to 'ACTIVE_TRA ...
- WaitType:CXPACKET
CXPACKET 等待类型是SQL Server 并发执行一个query时产生的.在run一个big query时,SQL Server充分利用系统的所有资源(CPU,Memory,IO),在最短时间 ...
- CTE 递归查询
使用CTE进行递归查询,能够实现对层次结构的数据的快速访问,非常有用. TSql CTE 递归原理探究 TSql 分层和递归查询 1,CTE的递归结构 递归查询的结构包括两部分:起始点和迭代公式. 使 ...
- 数据库的Disk Space usage
SQL Server占用的存储空间,包含数据库file占用的存储空间,数据库对象占用的存储空间. 一,数据库file占用的存储空间 1,使用 sys.master_files 查看数据库中各个file ...