存储在数据库中的日期为NULL的日期返回为01/01/1900,而不是DateTime.MinValue。

时间:2019-02-22 21:23:34

标签: c# datetime

我有一个逻辑可以执行以下操作:

string myData =  Convert.ToDateTime(Info.ClosedDate) == DateTime.MinValue ? String.Empty : "(" + Info.ClosedDate + ")";

如果未在数据库中存储为NULL,则应在括号中返回ClosedDate。否则它将返回一个空字符串。

Convert.ToDateTime(Info.ClosedDate)的值为01/01/1900DateTime.MinValue的值为1/1/0001 12:00:00 AM

因此,条件永远不会返回String.Empty

当前对象中的字段表示为:

public string ClosedDate
{
    get { return _ClosedDate; }
    set { _ClosedDate = value; }
}

什么是最佳解决方案?

3 个答案:

答案 0 :(得分:4)

不要将DateTime类型存储或建模为string

这适用于数据存储,也适用于代码中的模型。如果它在数据库中可以为空,则在代码中将其建模为Nullable<DateTime>(备用符号DateTime?)。仅在可能的最后时刻(通常是在表示层中)将其转换为string。如果这样做,则在读/写数据存储区时无需进行任何类型转换。您还可以避免在值解释上出现歧义(例如值是null还是将其本地化为“ dd / MM / yyyy”或“ MM / dd / yyyy” )。

private DateTime? _ClosedDate;
public DateTime? ClosedDate
{
    get { return _ClosedDate; }
    set { _ClosedDate = value; }
}

旁注:上面的内容也可以建模为auto属性,但我没有这样做,因为尚不清楚该字段如何在模型中使用

如果不确定如何将DateTime实例作为本机格式的参数传递给ADO.NET查询,请查看此先前的问题/答案:How can I add user-supplied input to an SQL statement?

答案 1 :(得分:0)

您可以与const inside = document.querySelector('.container #inside'); if(inside) { console.log('inside exists'); } else { console.log('no inside'); }

进行比较
SqlDateTime.MinValue

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqltypes.sqldatetime.minvalue?view=netframework-4.7.2

答案 2 :(得分:0)

尽管最好使用DateTime作为日期类型,但您的代码应如下所示:

public DateTime ClosedDate
{
    get; set;
}

您还可以使用自动属性(例如此属性)或专用设置来满足要求。

public DateTime ClosedDate 
{
   get;
   set
   {
     Date = DateTime.Now;
   }
}

对于字符串,可以使用DateTime.ParseDateTime.ParseExact代替Convert.ToDateTime

如果value为null,则ParseParseExact返回ArgumentNullException;如果value包含无效的日期格式,则返回FormatException

var convertedDate = DateTime.ParseExact(dateTime, "yyyyMMdd", CultureInfo.InvariantCulture);