您的位置:首页 > 数据库 > MySQL

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

2016-01-13 12:55 886 查看
本文目录列表:
1、基于当前日的小时数和分钟数
2、mysql unix_timestamp和from_unixtime的mssql实现
3、总结语
4、参考清单列表

基于当前日的小时数和分钟数

平时工作中遇到过一天内个时间段的用户登录情况的需求,也有针对每个小时内的分钟段内的用户的活跃度的需求,很多类似的需求都是针对更小时间刻度比如小时、分钟来进行数据分析的。针对这样类似的需求提供获取指定日期时间的基于所在当前日午夜零时的小时数或分钟数的功能函数。

提供基于当前日的小时数和分钟数的功能函数,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实现。

参考清单列表
1、https://msdn.microsoft.com/zh-cn/library/ms174420(v=sql.90).aspx
2、基于mysql unix_timestamp和from_unixtime的mssql实现参考了网上的实现方案,具体的参考网页忘记啦,如有博友指出我在加上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: