本文目录列表:
 
基于当前日的小时数和分钟数
 
    平时工作中遇到过一天内个时间段的用户登录情况的需求,也有针对每个小时内的分钟段内的用户的活跃度的需求,很多类似的需求都是针对更小时间刻度比如小时、分钟来进行数据分析的。针对这样类似的需求提供获取指定日期时间的基于所在当前日午夜零时的小时数或分钟数的功能函数。
 
    提供基于当前日的小时数和分钟数的功能函数,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. 第三次作业:PSP耗时

    PSP个人项目耗时对比记录表:四则运算   Personal Software Process Stages Time(%) Planning 7  Estimate 9 开发 76    •需求分析 ...

  2. java提高篇(二十)-----集合大家族

          在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的Arra ...

  3. Fatal error: Maximum function nesting level of '100' reached, aborting!

    这个问题是由于启用了xdebug,而xdebug默认设置了函数最大嵌套数为100 解决办法: 找到php.ini文件,找到xdebug在最后加上xdebug.max_nesting_level = 5 ...

  4. Linux—解压缩

    压缩和解压("//"命令的解释) 常用压缩格式    .zip    .gz    .bz2    .tar.bz2        .tar.gz .zip格式压缩: zip 压缩 ...

  5. Memcache基础教程

    Memcache是什么 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力. 它可以应 ...

  6. 第1讲 Redis部署与基本操作

    目录 一.简介 二.安装 1.默认安装位置 2.指定安装位置 3.安装的可执行文件的作用 三.启动与关闭 四.配置文件 五.Redis的数据类型 1. 共计5种类型 2. String(子串类型) 3 ...

  7. Java程序员的日常—— 基于类的策略模式、List<?>与List、泛型编译警告、同比和环比

    早晨起得太早,昨晚睡得太晚,一天都迷迷糊糊的.中午虽然睡了半个小时,可是依然没有缓过来.整个下午都在混沌中....不过今天下载了一款手游--<剑侠情缘>,感觉不错,喜欢这种类型的游戏. 今 ...

  8. salesforce 零基础学习(三十八)Translate 的使用(国际化处理)

    本篇参考:http://resources.docs.salesforce.com/200/17/en-us/sfdc/pdf/salesforce_workbench_cheatsheet.pdf ...

  9. salesforce 零基础学习(十九)Permission sets 讲解及设置

    Permission sets以及Profile是常见的设置访问权限的方式. Profile规则为'who see what'.通过Profile可以将一类的用户设置相同的访问权限.对于有着相同Pro ...

  10. MVC利用URLRoute实现伪静态

    routes.MapRoute(                    "Default", // Route name                    "{con ...