72

我不想验证txtBirthDate,所以我想传入DateTime.MinValue数据库。

我的代码:

 if (txtBirthDate.Text == string.Empty)
    objinfo.BirthDate = DateTime.MinValue;
 else
     objinfo.BirthDate =  DateTime.Parse(txtBirthDate.Text);

DateTime.MinValue返回Date = {1/1/0001 12:00:00 AM}

我收到一个 SQL 错误:

SqlDateTime 溢出。必须介于 1753 年 1 月 1 日上午 12:00:00 和 9999 年 12 月 31 日晚上 11:59:59 之间。

我理解但我不明白为什么 DateTime.MinValue返回无法插入数据库的无效日期时间。如何处理这种情况?

4

10 回答 10

112

非常简单,避免使用DateTime.MinValueuseSystem.Data.SqlTypes.SqlDateTime.MinValue代替。

于 2013-03-01T12:26:55.987 回答
98

基本上,不要DateTime.MinValue用来表示缺失值。您不能在 SQL Server DateTime 字段中使用DateTime.MinValue,因为 SQL Server 的最小值为 1753 的开头。

相反,将您的BirthDate属性设置为Nullable<DateTime>(aka DateTime?),并null在您没有​​值时将其设置为。还要确保您的数据库字段可以为空。然后你只需要确保它null最终成为NULL数据库中的一个值。具体如何操作将取决于您的数据访问权限,而您没有告诉我们任何相关信息。

于 2013-03-01T12:06:34.053 回答
12

虽然这是一个老问题,但另一种解决方案是使用 datetime2 作为数据库列。 MSDN 链接

于 2014-12-10T18:39:02.927 回答
11

嗯...获取 SQL 最小日期非常简单

DateTime sqlMinDateAsNetDateTime = System.Data.SqlTypes.SqlDateTime.MinValue.Value;
于 2016-10-03T14:48:02.127 回答
3

这是你可以做的。虽然有很多方法可以实现它。

DateTime? d = null;    
if (txtBirthDate.Text == string.Empty)
    objinfo.BirthDate = d;
else
    objinfo.BirthDate =  DateTime.Parse(txtBirthDate.Text);

注意:这仅在您的数据库日期时间列是 Allow Null 时才有效。否则,您可以为 DateTime d 定义标准最小值。

于 2013-03-01T12:34:59.163 回答
3

我正在使用这个函数来尝试解析

public static bool TryParseSqlDateTime(string someval, DateTimeFormatInfo dateTimeFormats, out DateTime tryDate)
    {
        bool valid = false;
        tryDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
        System.Data.SqlTypes.SqlDateTime sdt;
        if (DateTime.TryParse(someval, dateTimeFormats, DateTimeStyles.None, out tryDate))
        {
            try
            {
                sdt = new System.Data.SqlTypes.SqlDateTime(tryDate);
                valid = true;
            }
            catch (System.Data.SqlTypes.SqlTypeException ex)
            {

            }
        }

        return valid;
    }
于 2014-09-02T10:27:34.897 回答
2

来自 MSDN:

从 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据,精度为 1300 秒,即 3.33 毫秒。值四舍五入到 0.000、0.003 或 0.007 毫秒的增量。存储为两个 4 字节整数。前 4 个字节存储基准日期 1900 年 1 月 1 日之前或之后的天数。基准日期是系统的参考日期。不允许使用早于 1753 年 1 月 1 日的日期时间值。其他 4 个字节存储一天中的时间,表示为午夜后的毫秒数。秒的有效范围为 0–59。

SQL 对 DateTime 值使用与 C# 不同的系统。

您可以使用您的 MinValue 作为标记值 - 如果它是 MinValue - 将 null 传递给您的对象(并将日期存储为可为空的 DB 中)。

if(date == dateTime.Minvalue)
    objinfo.BirthDate = null;
于 2013-03-01T12:08:26.790 回答
2

简单地说,不要用作DateTime.MinVaue默认值。

有几个不同MinValues的,取决于你所处的环境。

我曾经有一个项目,我正在实施一个 Windows CE 项目,我使用的是框架DateTime.MinValue(0001 年)、数据库MinValue(1753 年)和 UI 控件DateTimePicker(我认为是 1970 年)。因此,至少有3 个不同的 MinValues会导致奇怪的行为和意外的结果。(而且我相信甚至还有第四个(!)版本,我只是不记得它来自哪里。)。

使用可为空的数据库字段并将您的值更改为 a Nullable<DateTime>。如果您的代码中没有有效值,那么数据库中也不应该有值。:-)

于 2013-03-01T12:16:21.170 回答
2

如果您使用 DATETIME2,您可能会发现必须将参数专门作为 DATETIME2 传递,否则它可能有助于将其转换为 DATETIME 并遇到同样的问题。

command.Parameters.Add("@FirstRegistration",SqlDbType.DateTime2).Value = installation.FirstRegistration;
于 2019-01-11T16:02:42.250 回答
-7

使用扩展

public static class DateTimeExtensions
{
    public static DateTime MinValue(this DateTime sqlDateTime)
    {
        return new DateTime(1900, 01, 01, 00, 00, 00);
    }
}


DateTime date = DateTime.Now;
Console.WriteLine("Minvalue is {0} ", date.MinValue().ToShortDateString());
于 2013-03-01T12:13:40.857 回答