DateTime
C# jest typ wartości, a nie typu urządzenia, a więc nie może być zerowy. Może to być jednak stała wartość DateTime.MinValue
, która znajduje się poza zakresem danych Sql Servers DATETIME
.
Typy wartości mają zawsze gwarantowaną wartość (domyślną) (zero) bez konieczności jawnego ustawiania (w tym przypadku DateTime.MinValue).
Podsumowując, prawdopodobnie masz niepoprawioną wartość DateTime, którą próbujesz przekazać do bazy danych.
DateTime.MinValue = 1/1/0001 12:00:00 AM
DateTime.MaxValue = 23:59:59.9999999, December 31, 9999,
exactly one 100-nanosecond tick
before 00:00:00, January 1, 10000
MSDN: DateTime.MinValue
chodzi SQL Server
datetime
Date and time data from January 1, 1753 through December 31, 9999, to an accuracy of one three-hundredth of a second (equivalent to 3.33 milliseconds or 0.00333 seconds). Values are rounded to increments of .000, .003, or .007 seconds
smalldatetime
Date and time data from January 1, 1900, through June 6, 2079, with accuracy to the minute. smalldatetime values with 29.998 seconds or lower are rounded down to the nearest minute; values with 29.999 seconds or higher are rounded up to the nearest minute.
MSDN: Sql Server DateTime and SmallDateTime
Wreszcie, jeśli znajdziesz się przechodzącą C# DateTime
jako ciąg do sql, należy sformatować go w następujący sposób, aby zachować maksymalną precyzję i zapobiec serwerowi sql z powodu podobnego błędu.
string sqlTimeAsString = myDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");
Update (8 lat później)
Rozważmy pomocą sql DateTime2
typ danych, który wyrównuje lepiej z .net DateTime
z zakresu dat 0001-01-01 through 9999-12-31
i przedziale czasowym 00:00:00 through 23:59:59.9999999
string dateTime2String = myDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffffff");
MSDN datetime2 (Transact-SQL)
postu kod. Możesz również rozważyć sprawdzenie, co linq buduje pod kołdrą. – NotMe