SQL Server时间粒度系列----第2节日期、周时间粒度详解
IF OBJECT_ID(N'dbo.ufn_Days', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_Days;
END
GO --==================================
-- 功能: 获得指定日期时间基于基准日期的总天数(一个整数值)
-- 说明: 如果指定的日期时间为NULL或者小于基准日期“--”时,则其值默认基准日期
-- 结果值为非负整数,从0开始计数。
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SET @intDays = dbo.ufn_Days('2008-01-14')
--==================================
CREATE FUNCTION dbo.ufn_Days
(
@dtmDate DATETIME -- 指定的日期时间
) RETURNS INT
--$Encode$--
AS
BEGIN
IF @dtmDate IS NULL OR @dtmDate < '1900-01-01'
BEGIN
SET @dtmDate = '1900-01-01';
END -- datepart参数也可以为dd或d
RETURN DATEDIFF(DAY, '1900-01-01', @dtmDate)
END
GO IF OBJECT_ID(N'dbo.ufn_Days2Date', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_Days2Date;
END
GO --==================================
-- 功能: 获得一个整数值基于基准日期对应的日期
-- 说明: 如果指定的整数值为NULL或为负整数时,则其值默认为0;
-- 如果指定的整数值大于“--”对应的整数值时,则其值默认设置为“--”对应的整数值
-- 结果值为从基准日期开始计数的日期
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SET @dtmDate = dbo.ufn_Days2Date() --'2008-01-14'
--==================================
CREATE FUNCTION dbo.ufn_Days2Date
(
@intDays INT -- 指定的整数值
) RETURNS DATETIME
--$Encode$--
AS
BEGIN
IF @intDays IS NULL OR @intDays <
BEGIN
SET @intDays = ;
END DECLARE @intMaxDays AS INT;
SET @intMaxDays = dbo.ufn_Days('9999-12-31'); IF @intDays >= @intMaxDays
BEGIN
SET @intDays = @intMaxDays;
END -- datepart参数也可以为dd或d
RETURN DATEADD(DAY, @intDays, '1900-01-01');
END
GO
SELECT dbo.ufn_Days(NULL) AS 'NULL值对应的整数值', dbo.ufn_Days('1899-12-31') AS '小于1900-01-01对应的整数值', dbo.ufn_Days('1900-01-01') AS '1900-01-01对应的整数值', dbo.ufn_Days('2016-01-07') AS '2016-01-07对应的整数值', dbo.ufn_Days('9999-12-31') AS '9999-12-31对应的整数值';
SELECT dbo.ufn_Days2Date(NULL) AS 'NULL值对应的日期', dbo.ufn_Days2Date(-) AS '小于0对应的日期', dbo.ufn_Days2Date() AS '0对应的日期', dbo.ufn_Days2Date() AS '42374对应的日期', dbo.ufn_Days2Date() AS '2958463对应的整数值', dbo.ufn_Days2Date() AS '大于2958463对应的整数值';
GO
执行后的查询结果如下图:


IF OBJECT_ID(N'dbo.ufn_WeekOfYear', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_WeekOfYear;
END
GO --==================================
-- 功能: 获取指定日期属于当前第几周
-- 说明: 一年最多1-53周
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SELECT dbo.ufn_WeekOfYear('2016-01-07');
--==================================
CREATE FUNCTION dbo.ufn_WeekOfYear
(
@dtmDate DATETIME
) RETURNS TINYINT
--$Encode$--
AS
BEGIN
-- datepart参数也可以为wk, ww
RETURN CAST(DATEPART(WEEK, @dtmDate) AS TINYINT)
END
GO IF OBJECT_ID(N'dbo.ufn_WeekdayNameOfWeek', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_WeekdayNameOfWeek;
END
GO --==================================
-- 功能: 获取指定日期属于当前周周几的名称
-- 说明: 结果值的展示形式会以来默认设置语言
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SELECT dbo.ufn_WeekOfYear('2016-01-07');
--==================================
CREATE FUNCTION dbo.ufn_WeekdayNameOfWeek
(
@dtmDate DATETIME
) RETURNS NVARCHAR()
--$Encode$--
AS
BEGIN
-- datepart参数也可以为dw
RETURN DATENAME(WEEKDAY, @dtmDate);
END
GO
测试以上函数效果的T-SQL代码如下:
SET LANGUAGE N'us_english';
SELECT @@LANGUAGE, dbo.ufn_WeekOfYear('2017-02-01'), dbo.ufn_WeekdayNameOfWeek('2017-02-01')
GO SET LANGUAGE N'简体中文';
SELECT @@LANGUAGE, dbo.ufn_WeekOfYear('2017-02-01'), dbo.ufn_WeekdayNameOfWeek('2017-02-01')
GO


IF OBJECT_ID(N'dbo.ufn_WeekdayOfWeek', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_WeekdayOfWeek;
END
GO --==================================
-- 功能: 获取指定日期隶属当前周周几
-- 说明: 结果值从1到7,分别对应从周一到周日,该值与@@DATEFISRT配置函数值保持一致
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SELECT dbo.ufn_WeekdayOfWeek('2017-01-07') -- (表示星期四)
--==================================
CREATE FUNCTION dbo.ufn_WeekdayOfWeek
(
@dtmDate DATETIME -- 指定的日期时间
) RETURNS TINYINT
--$Encode$--
BEGIN
DECLARE
@tintDateFirst AS TINYINT,
@tintWeekDayIndexID AS TINYINT,
@tintSum AS TINYINT; SELECT
@tintDateFirst = @@DATEFIRST,
@tintWeekDayIndexID = DATEPART(WEEKDAY, @dtmDate),
@tintSum = @tintDateFirst + @tintWeekDayIndexID; RETURN (CASE WHEN @tintSum >= THEN @tintSum - WHEN @tintSum = THEN ELSE @tintSum - END);
END
GO
DECLARE @tintLoopID AS TINYINT;
SET @tintLoopID = ; DECLARE @dtmDate AS DATETIME;
SET @dtmDate = '2016-01-07'; SELECT @dtmDate AS 'date', DATENAME(WEEKDAY, @dtmDate) AS 'WeekdayName';
WHILE @tintLoopID <=
BEGIN
SET DATEFIRST @tintLoopID; SELECT @@DATEFIRST AS 'Start Day Of Week[1=星期一、2=星期二、3=星期三,……,7=星期日]', dbo.ufn_WeekdayOfWeek(@dtmDate) AS 'Nth Of Week1=星期一、2=星期二、3=星期三,……,7=星期日]' SET @tintLoopID = @tintLoopID + ;
END
GO

SQL Server时间粒度系列----第2节日期、周时间粒度详解的更多相关文章
- SQL Server时间粒度系列----第4节季、年时间粒度详解
本文目录列表: 1.SQL Server季时间粒度2.SQL Server年时间粒度 3.总结语 4.参考清单列表 SQL Serve季时间粒度 季时间粒度也即是季度时间粒度.一年每3 ...
- SQL Server时间粒度系列----第1节时间粒度概述
本文目录列表: 1.什么是时间粒度?2.SQL Server提供的时间粒度3.SQL Server时间粒度代码演示 4.SQL Server基准日期 5.总结语6.参考清单列表 什么是时间粒度 ...
- 【目录】sql server 进阶篇系列
随笔分类 - sql server 进阶篇系列 sql server 下载安装标记 摘要: SQL Server 2017 的各版本和支持的功能 https://docs.microsoft.com/ ...
- SQL Server调优系列基础篇
前言 关于SQL Server调优系列是一个庞大的内容体系,非一言两语能够分析清楚,本篇先就在SQL 调优中所最常用的查询计划进行解析,力图做好基础的掌握,夯实基本功!而后再谈谈整体的语句调优. 通过 ...
- SQL Server调优系列基础篇(常用运算符总结——三种物理连接方式剖析)
前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL ...
- SQL Server调优系列基础篇(并行运算总结篇二)
前言 上一篇文章我们介绍了查看查询计划的并行运行方式. 本篇我们接着分析SQL Server的并行运算. 闲言少叙,直接进入本篇的正题. 技术准备 同前几篇一样,基于SQL Server2008R2版 ...
- SQL Server调优系列基础篇(索引运算总结)
前言 上几篇文章我们介绍了如何查看查询计划.常用运算符的介绍.并行运算的方式,有兴趣的可以点击查看. 本篇将分析在SQL Server中,如何利用先有索引项进行查询性能优化,通过了解这些索引项的应用方 ...
- SQL Server调优系列进阶篇(查询语句运行几个指标值监测)
前言 上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤.筛选条件分析.索引项优化等信息. 本篇我们分析在我们运行的过程中几个关键指标值的检测. 通过这些指标值来分析语句的运行问 ...
- SQL Server调优系列进阶篇(深入剖析统计信息)
前言 经过前几篇的分析,其实大体已经初窥到SQL Server统计信息的重要性了,所以本篇就要祭出这个神器了. 该篇内容会很长,坐好板凳,瓜子零食之类... 不废话,进正题 技术准备 数据库版本为SQ ...
- SQL Server调优系列进阶篇(如何维护数据库索引)
前言 上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看. 本篇延续上一篇的内容,继续分析索引这块,侧重索引项的日常 ...
随机推荐
- 生产环境下实践DDD中的规约模式
最近的开发工作涉及到两个模块“任务”和“日周报”.关系是日周报消费任务,因为用户在写日周报的时候,需要按一定的规则筛选当前用户的任务,作为日周报的一部分提交.整个项目采用类似于Orchard那种平台加 ...
- GitHub的多人协同开发配置
GitHub For Windows 下载地址:https://windows.github.com/ 基本的注册登录就不细讲了. 在源代码管理上,最重要的就是仓库了.仓库这一概念很容易理解,所谓仓库 ...
- android知识杂记(一)
记录项目中用的零碎知识点,用以备忘. android:screenOrientation:portrait 限制横屏 activity启动状态 singleTop 只执行一次,通常用在欢迎页面 sin ...
- 【开源】开发者新闻聚合APP 2.0.3发布(第二个稳定版本)
聚合了博客园新闻.infoq新闻.36kr新闻.oschina新闻.51cto新闻.csdn新闻: 争取做到随时刷随时有开发者的新闻! 目前还只支持安卓APP 但用的人多了,我会发布苹果版的APP 最 ...
- [.net 面向对象程序设计进阶] (8) 托管与非托管
本节导读:虽然在.NET编程过程中,绝大多数内存垃圾回收由CLR(公共语言运行时)自动回收,但也有很多需要我们编码回收.掌握托管与非托管的基本知识,可以有效避免某些情况下导致的程序异常. 1.什么是托 ...
- IO完成端口
从MSDN中翻译了IO完成端口的文章,不得不说翻译的很烂,英语需要继续提高啊... 在一个多处理器系统上,IO完成端口提供一个非常高效的线程模型来处理多个异步IO请求.当一个进程创建了一个IO完成端口 ...
- 基础调试命令 - .dump/.dumpcap/.writemem/!runaway
Windbg是windows平台上强大的调试器,它相对于其他常见的IDE集成的调试器有几个重要的优势, Windbg可以做内核态调试 Windbg可以脱离源代码进行调试 Windbg可以用来分析dum ...
- Java-单例模式(singleton)-转载
概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. ...
- Atitit vod ver 12 new feature v12 pb2 影吧 视频 电影 点播 播放系统v12新特性
Atitit vod ver 12 new feature v12 pb2 影吧 视频 电影 点播 播放系统v12新特性 项目分离从独立的se ver Run mode from brow ex to ...
- Atitit 订单处理原理与功能设计attilax总结
Atitit 订单处理原理与功能设计attilax总结 订单有三大订单分类,商品订单,充值支付订单,报名订单等..1 订单完成流程 "select * from orderv2 where ...