Sql 跨列将记号转换为日期
我遇到了这个SQL错误,我不确定如何避免它。它涉及到将.Net标记转换为最新版本。我也看到过关于这个问题的其他帖子,但只涉及到我会为一个条目做这件事的实例 我的问题是,我有一列要转换的记号,如下所示Sql 跨列将记号转换为日期,sql,.net,datetime,data-conversion,Sql,.net,Datetime,Data Conversion,我遇到了这个SQL错误,我不确定如何避免它。它涉及到将.Net标记转换为最新版本。我也看到过关于这个问题的其他帖子,但只涉及到我会为一个条目做这件事的实例 我的问题是,我有一列要转换的记号,如下所示 ACCCOUNT STARTDATE ENDDATE 0001 635200704000000000 635200704000000000 0002 635203296000000000 6352032960
ACCCOUNT STARTDATE ENDDATE
0001 635200704000000000 635200704000000000
0002 635203296000000000 635203296000000000
我该如何翻译这个呢
ACCCOUNT STARTDATE ENDDATE
0001 11/14/2013 11/14/2013
0002 11/17/2013 11/17/2013
我不确定该怎么办。谁能给我指一下正确的方向吗。下面是我在试图解决这个问题时设法拼凑起来的一段SQL。虽然我知道这不会给我想要的格式
SELECT READING.ACCOUNT,
datename(month,(READING.STARTDATE-599266080000000000)/864000000000) +
space(1) +
datename(d,(READING.STARTDATE-599266080000000000)/864000000000) +
', ' +
datename(year,(READING..STARTDATE-599266080000000000)/864000000000) as
READDATE
FROM READING
您可以在
.NET
中轻松地将记号转换为日期时间
,反之亦然。以下是示例代码供您参考
long ticks = (DateTime.Now).Ticks;
//Convert these ticks to DateTime
DateTime dtresult = new DateTime(ticks);
如果需要精确到刻度的精度:
declare @ticks bigint
set @ticks = 3155378975999999999 -- (DateTime.MaxValue.Ticks)
select DATEADD(D, @ticks / 864000000000,
DATEADD(MS, (@ticks % 864000000000) / 10000,
DATEADD(NS, (@ticks % 10000) * 100,
convert(datetime2, '0001-01-01'))))
-- ouputs: 9999-12-31 23:59:59.9999999
但在你的情况下,我认为你只是要求一整天的精确性:
declare @ticks bigint
set ticks = 635200704000000000
select DATEADD(D, @ticks / 864000000000, convert(datetime2, '0001-01-01'))
-- 635200704000000000 outputs 2013-11-15 00:00:00.0000000
-- 635203296000000000 outputs 2013-11-18 00:00:00.0000000
正如我在评论中所说,这些值与您所说的预期值相差一天,因此您可能也存在时区问题
给定列名,您可以将查询修改为:
SELECT ACCOUNT,
DATEADD(D, STARTDATE / 864000000000, convert(datetime2, '0001-01-01')) as StartDate,
DATEADD(D, ENDDATE / 864000000000, convert(datetime2, '0001-01-01')) as EndDate
FROM READING
嗯。。如果这些值是纯刻度,则与您显示的值相差一天。您是否也在尝试调整时区?(这些是UTC刻度,您需要本地日期吗?)另外,您正在寻找SQL解决方案还是.NET解决方案?不尝试调整时区,我正在寻找SQL解决方案。嗨,Matt……。感谢您的帮助,这对于转换单个条目非常有效。我不知道如何处理这数百个滴答声。我是否设置@ticks=[列名]???我尝试了一些方法,但没有效果。是的,只需将示例中的
@ticks
替换为您的列名即可。我更新了我的答案以向您展示。当我在整个表中运行时,会出现算术溢出错误。选择DATEADD(D,startdate/864000000000,convert(datetime2,'0001-01-01'))@GarrettJones-你能找出它溢出的值吗?