SQL SERVER2005数据库有个字段以datetime类型允许为空 在C#怎么样把这个时间字段赋为null
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL SERVER2005数据库有个字段以datetime类型允许为空 在C#怎么样把这个时间字段赋为null相关的知识,希望对你有一定的参考价值。
RTpublic DateTime CheckDateTime(DateTime dCompText) if (dCompText == System.DateTime.MinValue) ??????????? else return dCompText;
在C#中,DateTime不能赋为null,因为没有一个值可以说是null,你可以将某个值认为是NULL,在写数据库的时候,判断是你认为是NULL时,可以写入NULL,写入NULL的方法依据的操作数据库方法不同而不同,如用UPDATE语句,可以SET它为NULL 参考技术A 首先在数据库中取出来的时候,需要判断这个datetime是否为空(就是判断是否为DBNull)?如果为空,就用一个不存在的时间来替换空值,我使用0001-01-01来替代的;具体代码:DateTime age=reader["age"]!=DBNull.Value?(DateTime)reader["age"]:Convert.ToDateTime("0001-01-01");
最后在前台绑定的时候再判断如果是0001-01-01的转换成NULL,其他的值不变。
代码:<%# (Eval("Age","0:d")).ToString()=="0001-1-1"?"NULL":Eval("Age","0:d") %> 参考技术B 定义可空类型就行了
DateTime? date;
date = null; 参考技术C Nullable<DateTime> dt = null;
这样就可以给Datateime类型的变量赋上null值了,后继处理就简单了
SQL Server 更新字段最大值数据子集
【中文标题】SQL Server 更新字段最大值数据子集【英文标题】:SQL Server Update Field Max Value Subset of Data 【发布时间】:2017-11-14 14:14:39 【问题描述】:我正在尝试根据表中的数据子集更新文件。如果一个装配需要 3 个具有不同到货日期的组件,但只能在所有三个到货后才能组装,我如何更新已完成的字段? Complete 字段需要是类似程序集之间的 DateAdd 的 Max,但我不知道如何定义 WHERE 语句以基于程序集进行比较。
样本数据
SN Assembly Arrival ProcessingDays
1000 A1 2017-07-03 2
1001 A1 2017-06-02 2
1002 A1 2017-05-01 2
1003 A2 2017-12-15 2
1004 A3 2017-07-03 2
1005 A3 2017-06-02 2
1006 A3 2017-05-01 2
期望的输出
SN Assembly Arrival ProcessingDays Complete
1000 A1 2017-07-03 2 2017-07-05
1001 A1 2017-06-02 2 2017-07-05
1002 A1 2017-05-01 2 2017-07-05
1003 A2 2017-12-15 2 2017-12-17
1004 A3 2017-09-03 2 2017-09-05
1005 A3 2017-08-02 2 2017-09-05
1006 A3 2017-07-01 2 2017-09-05
【问题讨论】:
【参考方案1】:我不知道您是真的要更新表还是只生成Complete
列,但以下 CTE 应该是正确的。与您的问题有关的诀窍是,除了最大日期之外,还必须确定每个装配的最新记录的处理天数。为此,我在下面使用了两步 CTE。
WITH cte1 AS (
SELECT SN, Assembly, Arrival, ProcessingDays,
ROW_NUMBER() OVER (PARTITION BY Assembly ORDER BY Arrival DESC) rn
FROM yourTable
),
cte2 AS (
SELECT t1.SN, t1.Assembly, t1.Arrival, t1.ProcessingDays, t1.Complete,
DATEADD(dd, t2.ProcessingDays, t2.Arrival) AS NewComplete
FROM yourTable t1
INNER JOIN cte1 t2
ON t1.Assembly = t2.Assembly
WHERE
t2.rn = 1
)
CTE 在很多方面都非常有用,包括使用复杂逻辑轻松更新表,但方式简单。现在我们可以更新您的Complete
列如下:
UPDATE cte2
SET Complete = NewComplete;
这是一个全面更新,您的问题似乎暗示了您想要什么,但如果有意义的话,您可以在上述更新中添加 WHERE
子句。
【讨论】:
我认为它必须是一个更新命令,因为这些字段存在并且会不断更新 那么让我更新我的答案。我会假设你的表已经有一个空的Complete
列。
出现错误,我尝试了分号和逗号的各种组合:“Msg 319, Level 15, State 1, Line 248 关键字'with'附近的语法不正确。如果此语句是公用表表达式、xmlnamespaces 子句或更改跟踪上下文子句,之前的语句必须以分号结束。"
我的代码没有任何问题。我假设您的表名为yourTable
,但仅此而已。确保一起运行所有内容。我的意思是你应该突出显示从WITH cte1 AS ...
到更新的所有内容,然后一起运行。
我认为问题在于我在脚本的前面调用了 cte,所以它把它扔掉了,我把它分成了更小的脚本,它似乎可以工作。谢谢!以上是关于SQL SERVER2005数据库有个字段以datetime类型允许为空 在C#怎么样把这个时间字段赋为null的主要内容,如果未能解决你的问题,请参考以下文章
sql如何获得某个数据库里面的表的字段名,字段类型,字段长度(sql server2005)