将刻度转换为跨列的日期

时间:2015-10-06 03:09:10

标签: sql .net datetime data-conversion

我遇到了这个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

2 个答案:

答案 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);