Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 跨列将记号转换为日期_Sql_.net_Datetime_Data Conversion - Fatal编程技术网

Sql 跨列将记号转换为日期

Sql 跨列将记号转换为日期,sql,.net,datetime,data-conversion,Sql,.net,Datetime,Data Conversion,我遇到了这个SQL错误,我不确定如何避免它。它涉及到将.Net标记转换为最新版本。我也看到过关于这个问题的其他帖子,但只涉及到我会为一个条目做这件事的实例 我的问题是,我有一列要转换的记号,如下所示 ACCCOUNT STARTDATE ENDDATE 0001 635200704000000000 635200704000000000 0002 635203296000000000 6352032960

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

您可以在
.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-你能找出它溢出的值吗?