本文目录列表:
 
基于当前日的小时数和分钟数
 
    平时工作中遇到过一天内个时间段的用户登录情况的需求,也有针对每个小时内的分钟段内的用户的活跃度的需求,很多类似的需求都是针对更小时间刻度比如小时、分钟来进行数据分析的。针对这样类似的需求提供获取指定日期时间的基于所在当前日午夜零时的小时数或分钟数的功能函数。
 
    提供基于当前日的小时数和分钟数的功能函数,T-SQL代码如下:
 IF OBJECT_ID(N'dbo.ufn_HoursOfDay', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_HoursOfDay;
END
GO --==================================
-- 功能: 获取指定的日期日期基于所在当期日午夜零时的小时数
-- 作者: 结果值从0开始计数,包括0、1、2、……、23
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SET @tintHoursOfDay = dbo.ufn_HoursOfDay(GETDATE());
--==================================
CREATE FUNCTION dbo.ufn_HoursOfDay
(
@dtmDate DATETIME -- 指定的日期时间
)
RETURNS TINYINT
AS
BEGIN
RETURN DATEPART(HOUR, @dtmDate);
END
GO IF OBJECT_ID(N'dbo.ufn_MinutesOfDay', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_MinutesOfDay;
END
GO --==================================
-- 功能: 获取指定的日期时间基于所在当前日午夜零时的分钟数
-- 作者: 结果值从0开始计数,包括0、1、2、3、1439
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SET @sintMinutesOfDay = dbo.fn_MinutesOfDay(GETDATE());
--==================================
CREATE FUNCTION dbo.ufn_MinutesOfDay
(
@dtmDate DATETIME -- 指定的日期时间
)
RETURNS SMALLINT
AS
BEGIN
RETURN DATEPART(HOUR, @dtmDate) * 60 + DATEPART(MINUTE,@dtmDate);
END
GO
 
    测试以上功能函数的效果,T-SQL代码如下:
 DECLARE @dtmDateTime AS DATETIME;
SET @dtmDateTime = '2017-01-13 00:00:00' SELECT
@dtmDateTime AS 'The Current DateTime'
,dbo.ufn_HoursOfDay(@dtmDateTime) AS 'HoursOfDay'
,dbo.ufn_MinutesOfDay(@dtmDateTime) AS 'MinutesOfDay'; SET @dtmDateTime = '2017-01-13 12:01:00'
SELECT
@dtmDateTime AS 'The Current DateTime'
,dbo.ufn_HoursOfDay(@dtmDateTime) AS 'HoursOfDay'
,dbo.ufn_MinutesOfDay(@dtmDateTime) AS 'MinutesOfDay'; SET @dtmDateTime = '2017-01-13 23:59:00'
SELECT
@dtmDateTime AS 'The Current DateTime'
,dbo.ufn_HoursOfDay(@dtmDateTime) AS 'HoursOfDay'
,dbo.ufn_MinutesOfDay(@dtmDateTime) AS 'MinutesOfDay';
GO
 
    执行后的查询结果如下图
 
 
mysql unix_timestamp和from_unixtime的mssql实现
    
    在mysql中,有一对unix_timestamp和from_unixtime的一对函数,将带有小时分钟表的日期时间和整数实现相互转换,基于“1970-01-01"这个UTC基准日期的。之前处理过将mysql的数据建议到mssql时,迁移过来的mysql的数据中有关日期时间的全部是8字节整数保存的,当时的处理方案没有在源数据增加此整数对应的日期时间的字段列,而是在mssql中将这个整数转换为日期时间,所以将mysql中unix_timestamp和from_unixtime的功能在mssql中实现。
    
    MSSQL实现的针对功能函数,T-SQL代码如下:
 IF OBJECT_ID(N'dbo.ufn_UnixTimestamp', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_UnixTimestamp;
END
GO --==================================
-- 功能: 获取UnixTimestamp(unix日期时间戳)
-- 说明: 结果值从0开始计数,基于
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SELECT dbo.ufn_UnixTimestamp(GETDATE());
--==================================
CREATE FUNCTION dbo.ufn_UnixTimestamp
(
@dtmDateTime DATETIME -- 指定的日期时间
) RETURNS BIGINT
--$Encode$--
AS
BEGIN
DECLARE @dtmUnixBasedate AS DATETIME;
SET @dtmUnixBasedate = '1970-01-01';
DECLARE @tintCurrentTimeZone AS TINYINT;
SET @tintCurrentTimeZone = 8; IF @dtmDateTime IS NULL OR @dtmDateTime < DATEADD(HOUR, @tintCurrentTimeZone, @dtmUnixBasedate)
BEGIN
RETURN 0;
END SET @dtmDateTime = CONVERT(DATETIME, CONVERT(VARCHAR(23), @dtmDateTime, 120)); RETURN DATEDIFF(SECOND, @dtmUnixBasedate, DATEADD(HOUR, -1*@tintCurrentTimeZone, @dtmDateTime));
END
GO IF OBJECT_ID(N'dbo.ufn_FromUnixTimestamp', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_FromUnixTimestamp;
END
GO --==================================
-- 功能: 获取UnixTimestamp(unix日期时间戳)
-- 说明: 具体实现阐述
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SELECT dbo.ufn_FromUnixTimestamp(2);
--==================================
CREATE FUNCTION dbo.ufn_FromUnixTimestamp
(
@bintUnixTimestamp BIGINT -- 指定的整数
) RETURNS DATETIME
--$Encode$--
AS
BEGIN
DECLARE @dtmUnixBasedate AS DATETIME;
SET @dtmUnixBasedate = '1970-01-01';
DECLARE @tintCurrentTimeZone AS TINYINT;
SET @tintCurrentTimeZone = 8; IF @bintUnixTimestamp >= 1
BEGIN
RETURN DATEADD(HOUR, @tintCurrentTimeZone, DATEADD(SECOND, @bintUnixTimestamp, @dtmUnixBasedate))
END RETURN @dtmUnixBasedate;
END
GO
 
    测试以上功能函数的效果,T-SQL代码如下:
 DECLARE @dtmDateTime AS DATETIME;
SET @dtmDateTime = '1970-01-01'; SELECT
@dtmDateTime AS 'The Current DateTime'
,dbo.ufn_UnixTimestamp(@dtmDateTime) AS 'Bigint Value Base-on"1970-01-01"'
,dbo.ufn_FromUnixTimestamp(dbo.ufn_UnixTimestamp(@dtmDateTime)) AS 'The DateTime Mapping'; SET @dtmDateTime = '2016-01-11'; SELECT
@dtmDateTime AS 'The Current DateTime'
,dbo.ufn_UnixTimestamp(@dtmDateTime) AS 'Bigint Value Base-on"1970-01-01"'
,dbo.ufn_FromUnixTimestamp(dbo.ufn_UnixTimestamp(@dtmDateTime)) AS 'The DateTime Mapping';
GO
 
    执行后的查询结果如下图
 
 
总结语
 
    本文简单提供了获取指定的日期时间基于所在当前日的小时数和分钟数的功能函数,也提供了类似mysql unixtimestamp和from_unixtime针对功能函数的mssql实现。
 
参考清单列表
2、基于mysql unix_timestamp和from_unixtime的mssql实现参考了网上的实现方案,具体的参考网页忘记啦,如有博友指出我在加上。

SQL Server时间粒度系列----第6节基于当前日的小时数和分钟数与mysql unix_timestamp和from_unixtime的mssql实现的更多相关文章

  1. SQL Server时间粒度系列----第4节季、年时间粒度详解

    本文目录列表: 1.SQL Server季时间粒度2.SQL Server年时间粒度 3.总结语 4.参考清单列表   SQL Serve季时间粒度       季时间粒度也即是季度时间粒度.一年每3 ...

  2. SQL Server时间粒度系列----第9节时间粒度示例演示

    本文目录列表: 1.准备测试数据 2.向测试数据表添加相关时间粒度字段列 3.基于日月季年统计汇总的演示 4.总结语 5.参考清单列表   准备测试数据   为了提供不同时间粒度示例的演示,就需要测试 ...

  3. SQL Server时间粒度系列----第1节时间粒度概述

    本文目录列表: 1.什么是时间粒度?2.SQL Server提供的时间粒度3.SQL Server时间粒度代码演示   4.SQL Server基准日期 5.总结语6.参考清单列表   什么是时间粒度 ...

  4. SQL Server时间粒度系列----第3节旬、月时间粒度详解

    本文目录列表: 1.SQL Server旬时间粒度2.SQL Server月有关时间粒度 3.SQL Server函数重构 4.总结语 5.参考清单列表   SQL Server旬时间粒度       ...

  5. SQL Server时间粒度系列----第5节小时、分钟时间粒度详解

    本文目录列表: 1.SQL Server小时时间粒度2.SQL Server分钟时间粒度 3.总结语 4.参考清单列表   SQL Server小时时间粒度          这里说的时间粒度是指带有 ...

  6. SQL Server时间粒度系列----第8节位运算以及设置日历数据表节假日标志详解

    本文目录列表: 1.位运算 2.设置日历数据表节假日标志 3.总结语 4.参考清单列表   位运算   SQL Server支持的按位运算符有三个,分别为:按位与(&).按位或(|).按位异或 ...

  7. SQL Server时间粒度系列

        工作中经常遇到针对业务部门提出不同时间粒度(年.季度.月.周.日等等日期时间粒度,以下简称时间粒度)的数据统计汇总任务,也看到不少博友针对这方便的博文,结合SQL Server的日期时间函数和 ...

  8. SQL Server时间粒度系列----第7节日历数据表详解

    本文目录列表: 1.时间粒度有关描述 2.时间维度有关功能函数3.日历数据表 4.日历数据表数据填充 5.总结语 6.参考清单列表   时间粒度有关描述   将该系列涉及到的时间粒度以及分钟以下的粒度 ...

  9. SQL Server时间粒度系列----第2节日期、周时间粒度详解

    本文目录列表: 1.从MySQL提供的TO_DAYS和FROM_DAYS这对函数说起2.SQL Server日期时间粒度3.SQL Server周有关时间粒度 4.总结语 5.参考清单列表   从My ...

随机推荐

  1. 我的ORM之九 -- 生成器

    我的ORM索引 数据库连接字符串格式 <add name="dbo" connectionString="" providerName="MyS ...

  2. Python自动化测试(1)-自动化测试及基本技术手段概述

    生产力概述 在如今以google为首的互联网时代,软件的开发和生产模式都已经发生了变化, 在<参与感>一书提到:某位从微软出来的工程师很困惑,微软在google还有facebook这些公司 ...

  3. TW2015技术雷达中文版发布

    今天thoughtworks 2015新版技术雷达pdf发布了,你可以从这里下载http://engage.thoughtworks.com/HQ0000Q0QOf5pE70nbD00GP,在这里你可 ...

  4. [.net 面向对象程序设计进阶] (5) Lamda表达式(一) 创建委托

    [.net 面向对象程序设计进阶] (5) Lamda表达式(一)  创建委托 本节导读: 通过学习Lambda表达式,学会创建委托和表达式目录树,深入了解Lambda的特性,让你的代码变的更加清晰. ...

  5. Java提高篇(三八)-----Java集合细节(四):保持compareTo和equals同步

    在Java中我们常使用Comparable接口来实现排序,其中compareTo是实现该接口方法.我们知道compareTo返回0表示两个对象相等,返回正数表示大于,返回负数表示小于.同时我们也知道e ...

  6. Yii Model中添加默认搜索条件

    在查询中增加条件 public function defaultScope() { return array( 'condition' => " is_deleted = 0" ...

  7. Mybatis错误(一)org.apache.ibatis.exceptions.PersistenceException

    在映射文件中,通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型.在测试包装类型过程中产生了一个错误:org.apache.ibatis.exce ...

  8. ios 滚动视图响应touchesBegin,touchesEnd等方法

    能够滚动的控件都不会响应touchesBegin,touchesEnd等方法,这就需要对这个类进行封装 以UITextView为例 1,创建CustomTextView类,继承与UITextView ...

  9. 【管理心得之四十】中文“其他”、英文“other”、日文“その他”..........................................

    场景再现====================={某研讨会}本学期为:调查研究.整理总结阶段.本阶段的主要任务是: 一.学习理论,收集.汇编学习资料,提高自己的素质..... 二.通过对部分班级学生 ...

  10. iOS-----用LLDB调试,让移动开发更简单(二)

    image lookup –address 当我们有一个地址,想查找这个地址具体对应的文件位置,可以使用image lookup --address,简写为image lookup -a e.g: 当 ...