如何在c#中复制c#datetime整数值

时间:2014-07-08 21:41:14

标签: c# sql

有没有办法在c#中复制这个整数值?

select cast(getdate() as int)
-->
41827

我尝试了这个,但它与sql日期不一致:

public string SqlDate { 
    get 
    {
        double x = (DateTime.Now - DateTime.FromOADate(0)).TotalDays;
        return Math.Floor(x).ToString();
    } 
}

3 个答案:

答案 0 :(得分:1)

一种随机代码,但这样做:

void Main()
{
    int n = NumberOfDays(DateTime.Now);
    Console.WriteLine(n);
}

static int NumberOfDays(DateTime date)
{
  DateTime start = DateTime.Parse("12/31/1899");
  TimeSpan t = date - start;
  return (int)t.TotalDays;
}

基本上,施放到int似乎给出了从18/31/1899开始的天数。

作为旁注,依赖或使用这似乎不是一件好事。

答案 1 :(得分:1)

SQL Server datetime值在内部是一个元组,包含2个带符号的32位整数:

  • 高阶整数是从SQL Server日历的纪元(零点)开始的整天偏移,恰好是1 Jan 1900 00:00:00.000

  • 低阶整数是从一天开始的偏移,而不是以毫秒为单位,但在" ticks"约1/300秒。

getdate()将当前日期和时间作为datetime值返回。表达式cast( getdate() as int )完全等同于

datediff(day,'1 Jan 1900 00:00:00.000',getdate())

此查询

declare @epoch datetime = '4 July 2014 00:00:01.000'
select [raw]            = @epoch ,
       [cast]           = cast(@epoch as int) ,
       [datediff]       = datediff(day,'1 Jan 1900',@epoch) ,
       [highorder-word] = convert(int,substring( convert(varbinary(8),@epoch),1,4) ) ,
       [low-order-word] = convert(int,substring( convert(varbinary(8),@epoch),4,8) )

产生以下结果:

raw                     cast  datediff highorder-word low-order-word
----------------------- ----- -------- -------------- --------------
2014-07-04 00:00:01.000 41822 41822         41822           300

[你会注意到1秒正好是300个滴答。有一些历史原因可以解释为什么SQL Server会以如此奇怪的方式计算时间。据我所知,它可以追溯到Sybase SQL Server时代以及早期Windows和OS / 2盒装上的时钟分辨率不佳。

鉴于这一切,您可以在C#中获得相同的计数(自1900年以来的天数):

public string SqlDate
{
  get { return DaysSince1900( DateTime.Now ).ToString() ; }
}

private int DaysSince1900( DateTime now )
{
  TimeSpan period = now.Date - SqlServerEpoch ;
  return period.Days ;
}
static readonly DateTime SqlServerEpoch = new DateTime( 1900 , 1 , 1 ) ;

答案 2 :(得分:0)

在t-sql中,GetDate()返回一个日期时间,该日期时间将日期存储为自01/01/1753以来的天数,该时间存储为一天的小数部分。

因此Select Cast(GetDate() as int)将返回自19/1年1月1日以来的天数

相反,c#结构将日期时间存储为自01/01/0001以来的天数加上作为一天的小数部分的时间。

因此,为了在两者之间进行转换,您只需要考虑01/01/0001和01/01/1900之间的偏移天数

或者,如果您不想使用偏移并且您正在使用SQL Server 2008或更高版本,则可以使用SYSDATETIME()替换GETDATE()函数,该函数返回datetime2,该日期时间也用作参考01/01 /因此,c#date和t-sql日期将引用相同的数据,因此它们在转换为int时为相同的日期提供相同的数字。