SQL Server时间粒度系列----第6节基于当前日的小时数和分钟数与mysql unix_timestamp和from_unixtime的mssql实现...
生活随笔
收集整理的這篇文章主要介紹了
SQL Server时间粒度系列----第6节基于当前日的小时数和分钟数与mysql unix_timestamp和from_unixtime的mssql实现...
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文目錄列表: 1、基于當(dāng)前日的小時(shí)數(shù)和分鐘數(shù)
2、mysql?unix_timestamp和from_unixtime的mssql實(shí)現(xiàn) 3、總結(jié)語 4、參考清單列表 基于當(dāng)前日的小時(shí)數(shù)和分鐘數(shù) ? ? ??平時(shí)工作中遇到過一天內(nèi)個(gè)時(shí)間段的用戶登錄情況的需求,也有針對(duì)每個(gè)小時(shí)內(nèi)的分鐘段內(nèi)的用戶的活躍度的需求,很多類似的需求都是針對(duì)更小時(shí)間刻度比如小時(shí)、分鐘來進(jìn)行數(shù)據(jù)分析的。針對(duì)這樣類似的需求提供獲取指定日期時(shí)間的基于所在當(dāng)前日午夜零時(shí)的小時(shí)數(shù)或分鐘數(shù)的功能函數(shù)。 ? ? 提供基于當(dāng)前日的小時(shí)數(shù)和分鐘數(shù)的功能函數(shù),T-SQL代碼如下: 1 IF OBJECT_ID(N'dbo.ufn_HoursOfDay', 'FN') IS NOT NULL 2 BEGIN 3 DROP FUNCTION dbo.ufn_HoursOfDay; 4 END 5 GO 6 7 --================================== 8 -- 功能: 獲取指定的日期日期基于所在當(dāng)期日午夜零時(shí)的小時(shí)數(shù) 9 -- 作者: 結(jié)果值從0開始計(jì)數(shù),包括0、1、2、……、23 10 -- 作者: XXX 11 -- 創(chuàng)建: yyyy-MM-dd 12 -- 修改: yyyy-MM-dd XXX 修改內(nèi)容描述 13 -- 調(diào)用: SET @tintHoursOfDay = dbo.ufn_HoursOfDay(GETDATE()); 14 --================================== 15 CREATE FUNCTION dbo.ufn_HoursOfDay 16 ( 17 @dtmDate DATETIME -- 指定的日期時(shí)間 18 ) 19 RETURNS TINYINT 20 AS 21 BEGIN 22 RETURN DATEPART(HOUR, @dtmDate); 23 END 24 GO 25 26 27 IF OBJECT_ID(N'dbo.ufn_MinutesOfDay', 'FN') IS NOT NULL 28 BEGIN 29 DROP FUNCTION dbo.ufn_MinutesOfDay; 30 END 31 GO 32 33 --================================== 34 -- 功能: 獲取指定的日期時(shí)間基于所在當(dāng)前日午夜零時(shí)的分鐘數(shù) 35 -- 作者: 結(jié)果值從0開始計(jì)數(shù),包括0、1、2、3、1439 36 -- 作者: XXX 37 -- 創(chuàng)建: yyyy-MM-dd 38 -- 修改: yyyy-MM-dd XXX 修改內(nèi)容描述 39 -- 調(diào)用: SET @sintMinutesOfDay = dbo.fn_MinutesOfDay(GETDATE()); 40 --================================== 41 CREATE FUNCTION dbo.ufn_MinutesOfDay 42 ( 43 @dtmDate DATETIME -- 指定的日期時(shí)間 44 ) 45 RETURNS SMALLINT 46 AS 47 BEGIN 48 RETURN DATEPART(HOUR, @dtmDate) * 60 + DATEPART(MINUTE,@dtmDate); 49 END 50 GO
2、mysql?unix_timestamp和from_unixtime的mssql實(shí)現(xiàn) 3、總結(jié)語 4、參考清單列表 基于當(dāng)前日的小時(shí)數(shù)和分鐘數(shù) ? ? ??平時(shí)工作中遇到過一天內(nèi)個(gè)時(shí)間段的用戶登錄情況的需求,也有針對(duì)每個(gè)小時(shí)內(nèi)的分鐘段內(nèi)的用戶的活躍度的需求,很多類似的需求都是針對(duì)更小時(shí)間刻度比如小時(shí)、分鐘來進(jìn)行數(shù)據(jù)分析的。針對(duì)這樣類似的需求提供獲取指定日期時(shí)間的基于所在當(dāng)前日午夜零時(shí)的小時(shí)數(shù)或分鐘數(shù)的功能函數(shù)。 ? ? 提供基于當(dāng)前日的小時(shí)數(shù)和分鐘數(shù)的功能函數(shù),T-SQL代碼如下: 1 IF OBJECT_ID(N'dbo.ufn_HoursOfDay', 'FN') IS NOT NULL 2 BEGIN 3 DROP FUNCTION dbo.ufn_HoursOfDay; 4 END 5 GO 6 7 --================================== 8 -- 功能: 獲取指定的日期日期基于所在當(dāng)期日午夜零時(shí)的小時(shí)數(shù) 9 -- 作者: 結(jié)果值從0開始計(jì)數(shù),包括0、1、2、……、23 10 -- 作者: XXX 11 -- 創(chuàng)建: yyyy-MM-dd 12 -- 修改: yyyy-MM-dd XXX 修改內(nèi)容描述 13 -- 調(diào)用: SET @tintHoursOfDay = dbo.ufn_HoursOfDay(GETDATE()); 14 --================================== 15 CREATE FUNCTION dbo.ufn_HoursOfDay 16 ( 17 @dtmDate DATETIME -- 指定的日期時(shí)間 18 ) 19 RETURNS TINYINT 20 AS 21 BEGIN 22 RETURN DATEPART(HOUR, @dtmDate); 23 END 24 GO 25 26 27 IF OBJECT_ID(N'dbo.ufn_MinutesOfDay', 'FN') IS NOT NULL 28 BEGIN 29 DROP FUNCTION dbo.ufn_MinutesOfDay; 30 END 31 GO 32 33 --================================== 34 -- 功能: 獲取指定的日期時(shí)間基于所在當(dāng)前日午夜零時(shí)的分鐘數(shù) 35 -- 作者: 結(jié)果值從0開始計(jì)數(shù),包括0、1、2、3、1439 36 -- 作者: XXX 37 -- 創(chuàng)建: yyyy-MM-dd 38 -- 修改: yyyy-MM-dd XXX 修改內(nèi)容描述 39 -- 調(diào)用: SET @sintMinutesOfDay = dbo.fn_MinutesOfDay(GETDATE()); 40 --================================== 41 CREATE FUNCTION dbo.ufn_MinutesOfDay 42 ( 43 @dtmDate DATETIME -- 指定的日期時(shí)間 44 ) 45 RETURNS SMALLINT 46 AS 47 BEGIN 48 RETURN DATEPART(HOUR, @dtmDate) * 60 + DATEPART(MINUTE,@dtmDate); 49 END 50 GO
?
? ? 測試以上功能函數(shù)的效果,T-SQL代碼如下: 1 DECLARE @dtmDateTime AS DATETIME; 2 SET @dtmDateTime = '2017-01-13 00:00:00' 3 4 SELECT 5 @dtmDateTime AS 'The Current DateTime' 6 ,dbo.ufn_HoursOfDay(@dtmDateTime) AS 'HoursOfDay' 7 ,dbo.ufn_MinutesOfDay(@dtmDateTime) AS 'MinutesOfDay'; 8 9 SET @dtmDateTime = '2017-01-13 12:01:00' 10 SELECT 11 @dtmDateTime AS 'The Current DateTime' 12 ,dbo.ufn_HoursOfDay(@dtmDateTime) AS 'HoursOfDay' 13 ,dbo.ufn_MinutesOfDay(@dtmDateTime) AS 'MinutesOfDay'; 14 15 SET @dtmDateTime = '2017-01-13 23:59:00' 16 SELECT 17 @dtmDateTime AS 'The Current DateTime' 18 ,dbo.ufn_HoursOfDay(@dtmDateTime) AS 'HoursOfDay' 19 ,dbo.ufn_MinutesOfDay(@dtmDateTime) AS 'MinutesOfDay'; 20 GO?
執(zhí)行后的查詢結(jié)果如下圖: mysql?unix_timestamp和from_unixtime的mssql實(shí)現(xiàn) 在mysql中,有一對(duì)unix_timestamp和from_unixtime的一對(duì)函數(shù),將帶有小時(shí)分鐘表的日期時(shí)間和整數(shù)實(shí)現(xiàn)相互轉(zhuǎn)換,基于“1970-01-01"這個(gè)UTC基準(zhǔn)日期的。之前處理過將mysql的數(shù)據(jù)建議到mssql時(shí),遷移過來的mysql的數(shù)據(jù)中有關(guān)日期時(shí)間的全部是8字節(jié)整數(shù)保存的,當(dāng)時(shí)的處理方案沒有在源數(shù)據(jù)增加此整數(shù)對(duì)應(yīng)的日期時(shí)間的字段列,而是在mssql中將這個(gè)整數(shù)轉(zhuǎn)換為日期時(shí)間,所以將mysql中unix_timestamp和from_unixtime的功能在mssql中實(shí)現(xiàn)。 MSSQL實(shí)現(xiàn)的針對(duì)功能函數(shù),T-SQL代碼如下: 1 IF OBJECT_ID(N'dbo.ufn_UnixTimestamp', 'FN') IS NOT NULL 2 BEGIN 3 DROP FUNCTION dbo.ufn_UnixTimestamp; 4 END 5 GO 6 7 --================================== 8 -- 功能: 獲取UnixTimestamp(unix日期時(shí)間戳) 9 -- 說明: 結(jié)果值從0開始計(jì)數(shù),基于 10 -- 作者: XXX 11 -- 創(chuàng)建: yyyy-MM-dd 12 -- 修改: yyyy-MM-dd XXX 修改內(nèi)容描述 13 -- 調(diào)用: SELECT dbo.ufn_UnixTimestamp(GETDATE()); 14 --================================== 15 CREATE FUNCTION dbo.ufn_UnixTimestamp 16 ( 17 @dtmDateTime DATETIME -- 指定的日期時(shí)間 18 ) RETURNS BIGINT 19 --$Encode$-- 20 AS 21 BEGIN 22 DECLARE @dtmUnixBasedate AS DATETIME; 23 SET @dtmUnixBasedate = '1970-01-01'; 24 DECLARE @tintCurrentTimeZone AS TINYINT; 25 SET @tintCurrentTimeZone = 8; 26 27 IF @dtmDateTime IS NULL OR @dtmDateTime < DATEADD(HOUR, @tintCurrentTimeZone, @dtmUnixBasedate) 28 BEGIN 29 RETURN 0; 30 END 31 32 SET @dtmDateTime = CONVERT(DATETIME, CONVERT(VARCHAR(23), @dtmDateTime, 120)); 33 34 RETURN DATEDIFF(SECOND, @dtmUnixBasedate, DATEADD(HOUR, -1*@tintCurrentTimeZone, @dtmDateTime)); 35 END 36 GO 37 38 39 IF OBJECT_ID(N'dbo.ufn_FromUnixTimestamp', 'FN') IS NOT NULL 40 BEGIN 41 DROP FUNCTION dbo.ufn_FromUnixTimestamp; 42 END 43 GO 44 45 --================================== 46 -- 功能: 獲取UnixTimestamp(unix日期時(shí)間戳) 47 -- 說明: 具體實(shí)現(xiàn)闡述 48 -- 作者: XXX 49 -- 創(chuàng)建: yyyy-MM-dd 50 -- 修改: yyyy-MM-dd XXX 修改內(nèi)容描述 51 -- 調(diào)用: SELECT dbo.ufn_FromUnixTimestamp(2); 52 --================================== 53 CREATE FUNCTION dbo.ufn_FromUnixTimestamp 54 ( 55 @bintUnixTimestamp BIGINT -- 指定的整數(shù) 56 ) RETURNS DATETIME 57 --$Encode$-- 58 AS 59 BEGIN 60 DECLARE @dtmUnixBasedate AS DATETIME; 61 SET @dtmUnixBasedate = '1970-01-01'; 62 DECLARE @tintCurrentTimeZone AS TINYINT; 63 SET @tintCurrentTimeZone = 8; 64 65 IF @bintUnixTimestamp >= 1 66 BEGIN 67 RETURN DATEADD(HOUR, @tintCurrentTimeZone, DATEADD(SECOND, @bintUnixTimestamp, @dtmUnixBasedate)) 68 END 69 70 RETURN @dtmUnixBasedate; 71 END 72 GO?
?測試以上功能函數(shù)的效果,T-SQL代碼如下: 1 DECLARE @dtmDateTime AS DATETIME; 2 SET @dtmDateTime = '1970-01-01'; 3 4 SELECT 5 @dtmDateTime AS 'The Current DateTime' 6 ,dbo.ufn_UnixTimestamp(@dtmDateTime) AS 'Bigint Value Base-on"1970-01-01"' 7 ,dbo.ufn_FromUnixTimestamp(dbo.ufn_UnixTimestamp(@dtmDateTime)) AS 'The DateTime Mapping'; 8 9 SET @dtmDateTime = '2016-01-11'; 10 11 SELECT 12 @dtmDateTime AS 'The Current DateTime' 13 ,dbo.ufn_UnixTimestamp(@dtmDateTime) AS 'Bigint Value Base-on"1970-01-01"' 14 ,dbo.ufn_FromUnixTimestamp(dbo.ufn_UnixTimestamp(@dtmDateTime)) AS 'The DateTime Mapping'; 15 GO?
執(zhí)行后的查詢結(jié)果如下圖: 總結(jié)語 ? ? ? 本文簡單提供了獲取指定的日期時(shí)間基于所在當(dāng)前日的小時(shí)數(shù)和分鐘數(shù)的功能函數(shù),也提供了類似mysql unixtimestamp和from_unixtime針對(duì)功能函數(shù)的mssql實(shí)現(xiàn)。 ? 參考清單列表 1、https://msdn.microsoft.com/zh-cn/library/ms174420(v=sql.90).aspx 2、基于mysql?unix_timestamp和from_unixtime的mssql實(shí)現(xiàn)參考了網(wǎng)上的實(shí)現(xiàn)方案,具體的參考網(wǎng)頁忘記啦,如有博友指出我在加上。轉(zhuǎn)載于:https://www.cnblogs.com/dzy863/p/5126915.html
總結(jié)
以上是生活随笔為你收集整理的SQL Server时间粒度系列----第6节基于当前日的小时数和分钟数与mysql unix_timestamp和from_unixtime的mssql实现...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 循序渐进看Java web日志跟踪(2)
- 下一篇: “赋值”与“初始化”