sql server 日期函数 [LocalTimeToUTC]、[UtcToLocalTime]、ConverToMidnight函数

AX 2012表定义中,datetime类型默认值为utc微秒置0,之前的procedure 中日期有的是hardcode,谈判有的是getdate(),在马拉,太国,turky,US,格林威冶时间,us turky与祖国有时差

对比

select dateadd(millisecond, -datepart(millisecond,getutcdate()),getutcdate())
SELECT getdate(),getdate(),getdate(),getdate() 

如图


同一查询日期一致,通过dateadd,datepart将微秒置0

所以格林威冶之夜可以系

select  dateadd(hour, -datepart(hour,getutcdate()),dateadd(MINUTE, -datepart(MINUTE,getutcdate()),dateadd(second, -datepart(second,getutcdate()),dateadd(millisecond, -datepart(millisecond,getutcdate()),getutcdate()))))


当然可以用cast(getdate() as date)

select cast(getdate() as date)
select cast(cast(getdate() as date) AS DATETIME)

  • ConverToMidnight
IF object_id('dbo.ConverToMidnight') IS NOT NULL
BEGIN 
	PRINT 'Dropping function dbo.ConverToMidnight'
	DROP FUNCTION dbo.ConverToMidnight
	IF @@ERROR = 0 PRINT 'Function dbo.ConverToMidnight dropped'
END
go

CREATE FUNCTION dbo.ConverToMidnight (
	@TimeToChange         AS DATETIME
)
RETURNS DATETIME 
BEGIN
    DECLARE @Midnight DATETIME
	SET @Midnight= dateadd(hour, -datepart(hour,@TimeToChange),dateadd(MINUTE, -datepart(MINUTE,@TimeToChange),dateadd(second, -datepart(second,@TimeToChange),dateadd(millisecond, -datepart(millisecond,@TimeToChange ),@TimeToChange ))))
	RETURN @Midnight
END
GO
SELECT dbo.convertomidnight(GETDATE()) AS midnight

  • dbo.[LocalTimeToUTC] 通过DATEDIFF(second,  GETdate() , GETUTCDATE()) 攻取时差
IF object_id('dbo.[LocalTimeToUTC]') IS NOT NULL
BEGIN 
	PRINT 'Dropping function dbo.[LocalTimeToUTC]'
	DROP FUNCTION dbo.[LocalTimeToUTC]
	IF @@ERROR = 0 PRINT 'Function dropped dbo.[LocalTimeToUTC]'
END
go

CREATE FUNCTION dbo.[LocalTimeToUTC]
( 
	@LocalTimeToChange         AS DATETIME
)
RETURNS DATETIME

BEGIN
	DECLARE @ConvertedUTCTime DATETIME
			,@Offset INT 
	-- Figure out the time difference between UTC and Local time
	SET @Offset = DATEDIFF(second,  GETdate() , GETUTCDATE()) 
	-- convert local DateTime to UTC
	SET @ConvertedUTCTime = DATEADD(second, @Offset, @LocalTimeToChange)	
	-- return UTC DateTime
	RETURN @ConvertedUTCTime
END
GO

测试
SELECT getdate()AS [getdate],getutcdate() AS [getutcdate]
SELECT cast('2012-12-12' AS DATETIME) as LocalTime, dbo.[LocalTimeToUTC]('2012-12-12') AS [LocalTimeToUTC]
SELECT getdate()AS [getdate],dbo.[LocalTimeToUTC](getdate()) AS [LocalTimeToUTC]

如图

  • [dbo].[UtcToLocalTime]  
IF object_id('[dbo].[UtcToLocalTime]') IS NOT NULL
BEGIN 
	PRINT 'Dropping function [dbo].[UtcToLocalTime]'
	DROP FUNCTION [dbo].[UtcToLocalTime]
	IF @@ERROR = 0 PRINT 'Function [dbo].[UtcToLocalTime] dropped '
END
go
 
CREATE FUNCTION [dbo].[UtcToLocalTime]dbo.[LocalTimeToUTC]
(
	@UtcDateTime datetime
)
RETURNS DateTime
AS
BEGIN

DECLARE @UTCDate datetime
		, @LocalDate datetime
		, @TimeDiff INT
		
-- Figure out the time difference between UTC and Local time
SET @UTCDate = GETUTCDATE()
SET @LocalDate = GETDATE()
SET @TimeDiff = DATEDIFF(second, @UTCDate, @LocalDate)

-- convert UTC to local DateTime
DECLARE @ConvertedLocalTime datetime
SET @ConvertedLocalTime = DATEADD(second, @TimeDiff, @UtcDateTime)

-- return local DateTime
RETURN @ConvertedLocalTime
END
GO
test
SELECT [dbo].[UtcToLocalTime](GETDATE())AS [ ]
SELECT [dbo].[UtcToLocalTime](GETUTCDATE())AS [ ]

result
....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值