一個SQL Server datetime
值在內部是一個元組,保持2符號的32位整數:
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 boxen上糟糕的時鐘分辨率。
鑑於這一切,你可以得到相同的數(自1900年以來天)這樣在C#:
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) ;
以何種方式是不相符的,多少天是它關掉? – CodeCaster
您使用的是哪個數據庫? –
你試圖解決什麼是潛在的問題? – Pleun