有没有办法在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();
}
}
答案 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时为相同的日期提供相同的数字。