gpt4 book ai didi

.net - 将 SQL Server DateTime 对象转换为 BIGINT(.Net 刻度)

转载 作者:行者123 更新时间:2023-12-02 06:49:56 25 4
gpt4 key购买 nike

我需要将 DateTime 类型值转换为 .Net 刻度格式的 BIGINT 类型(自 0001 年 1 月 1 日午夜 12:00:00 以来经过的 100 纳秒间隔数)。

转换应在 Sql server 2008 中使用 T-SQL 查询执行

例如:

DateTime value - 12/09/2011 00:00:00

将转换为:

BIGINT value - 634513824000000000

最佳答案

我争论是否发布这个,因为它取决于日期在 SQL Server 中如何以二进制级别存储,因此这是一个非常脆弱的解决方案。对于除了一次性转换之外的任何事情,我都会使用@Solution Evangelist 发布的答案之类的内容。不过,您可能会发现这在学术方面很有趣,所以我无论如何都会发布它。

利用 DateTime2 的准确性与 .NET 中的刻度持续时间相匹配的事实,并且两者都基于 01-01-0001 00:00 的开始日期: 00.0000000,您可以将DateTime转换为DateTime2,然后将其转换为binary(9):0x07F06C999F3CB7340B

日期时间信息存储为 RTL,因此反转,我们将得到 0x0B34B73C9F996CF007

前三个字节存储自 01-01-0001 以来的天数,接下来的 5 个字节存储自当天午夜以来的 100ns 刻度,因此我们可以将天数乘以按一天中的刻度,并添加代表当天耗时的刻度。

执行以下代码:

set @date = getdate()
set @ticksPerDay = 864000000000

declare @date2 datetime2 = @date

declare @dateBinary binary(9) = cast(reverse(cast(@date2 as binary(9))) as binary(9))
declare @days bigint = cast(substring(@dateBinary, 1, 3) as bigint)
declare @time bigint = cast(substring(@dateBinary, 4, 5) as bigint)

select @date as [DateTime], @date2 as [DateTime2], @days * @ticksPerDay + @time as [Ticks]

返回以下结果:

DateTime                DateTime2              Ticks
----------------------- ---------------------- --------------------
2011-09-12 07:20:32.587 2011-09-12 07:20:32.58 634514088325870000

获取返回的 Ticks 数并转换回 .NET 中的日期时间:

DateTime dt = new DateTime(634514088325870000);
dt.ToString("yyyy-MM-dd HH:mm:ss.fffffff").Dump();

从 SQL Server 获取日期:

2011-09-12 07:20:32.5870000

关于.net - 将 SQL Server DateTime 对象转换为 BIGINT(.Net 刻度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7386634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com