为什么日期提交不是空的但是1900-01-01?

时间:2016-11-30 06:29:52

标签: c# sql sql-server c#-4.0

我一直在后端工作,即在Sql server 2012中。我在表中声明了一个字段为日期,即 ParawiseDate datetime

我从C#传递一个NULL,即

sqlcom.Parameters.AddWithValue("@ParawiseDate", NULL);

问题:

它将日期保存为 1900-01-01 ,而不是 NULL 。我尝试""并保存为 1900-01-01

为什么?

4 个答案:

答案 0 :(得分:1)

确保它在ParawiseDate列中允许空值。而不是传递Null尝试DBNull.value

sqlcom.Parameters.AddWithValue("@ParawiseDate", DbNull.Value);

答案 1 :(得分:0)

我相信DateTime,你可以用“?”声明类型,否则他们将默认为1900-01-01

DateTime ? Parameter;

也尝试传入

typeof(System.DateTime) 

而不是NULL,在第二个参数

答案 2 :(得分:0)

必须知道数据的二进制表示是什么以及允许哪些强制转换。没有它,任何程序员都会有些失明。对于这种情况,在MS SQL中,默认日期值为1900-01-01。在旧的CLR AddWithValue中,DBNull.Value作为值等效于将字段设置为默认值。 我没有处理4.0 CLR环境,但我可能期望NULL可以被转换为DBNull?在任何情况下,它都不是日期值,或者是否可以使用默认值将NULL隐式地转换为Date? (后者会说MS再次离开标准,NULL现在必须等于指向任何对象的指针)很可能是一个没有文档的副作用。

public SqlParameter AddWithValue(
    string parameterName,
    object value
)

参数

  • parameterName 输入:System.String 参数的名称。

  • value 输入:System.Object 要添加的值。使用DBNull.Value代替null,表示空值。

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue(v=vs.110).aspx

Date和DateTime不能为NULL,但表中的字段可以设置为允许空值。出于安全原因,通常不会读取数据会导致获取默认值。这需要单独检查(isDBNull?)

只有SQL中的日期合法值(至少是Microsoft风格)是0001-01-01到9999-12-31,应该明确给出,否则将使用默认值。

答案 3 :(得分:0)

SELECT cast(NULLIF(t.[ParawiseDate],'') AS DATE) 
FROM tablename t