我遇到了这个SQL错误,而且我不确定如何解决它。它涉及到.Net滴答到目前为止。我在这个问题上遇到过其他帖子,但仅涉及我为一个条目执行此操作的情况。
我的问题是我有一列我想转换的刻度线,类似于下面的内容。
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
答案 0 :(得分:1)
如果您需要精确到精确度:
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
答案 1 :(得分:0)
您可以轻松地将刻度转换为Datetime
,反之亦然.NET
。以下是供您参考的示例代码。
long ticks = (DateTime.Now).Ticks;
//Convert these ticks to DateTime
DateTime dtresult = new DateTime(ticks);