【问题标题】:Compare null value for datetime比较日期时间的空值
【发布时间】:2017-11-13 14:02:07
【问题描述】:

我将日期作为字符串存储在 sql 表中。如果日期未通过,则它将为空。现在我想从asp.net的设计页面检查日期是否为空。我收到类型转换错误。有人知道如何克服这个问题吗?

<%# ((DateTime)Eval("Date")).ToString("yyy-MM-dd hh:mm tt") %>">

这里的数据是作为字符串输入的。

谢谢

【问题讨论】:

  • 您只是想在这里将字符串转换为 DateTime,您需要正确解析它。另外,不要将数据库中的日期存储为字符串,将它们存储为日期!
  • “我将日期作为字符串存储在 sql 表中。”你的问题!。阅读 Aaron Bertrand 的 Bad habits to kick : choosing the wrong data type
  • 很明显,转换错误是由您尝试比较的数据类型不匹配引起的,请考虑将数据库中的日期数据类型从 string 更改为 DateTime。跨度>
  • 另外,您使用什么类型的输入控件进行日期输入,例如DateTimePickerTextBox?
  • 感谢您的回复,实际上我是在 UI 上显示表格数据。如果我将列设为日期时间,它将存储默认日期并显示在 UI 上。为了避免默认日期显示,我将列设置为 varchar。但是现在我想执行一些操作,并且不允许空值。

标签: c# asp.net


【解决方案1】:

我将日期作为字符串存储在 SQL 表中。

这是您的第一个问题 (here is a good explanation of why this is a problem)。

我收到类型转换错误。

这就是您的第一个问题(将日期存储为字符串)导致您的第二个问题(类型转换错误)的方式。虽然可以通过使用 DateTime.ParseDateTime.ParseExactDateTime.TryParse 解析来自 string 的日期来解决此问题,但我强烈建议不要使用这些方法中的任何一种。

好消息是,一旦你解决了第一个问题,第二个问题就会自行消失!

使用这种方法更改列的类型而不丢失数据:

  • Add a new column 类型为 date 到您的餐桌
  • 运行更新语句,从包含日期字符串表示的旧 varchar 列填充新的 date
  • 删除旧的varchar

【讨论】:

  • ...并希望没有任何内容引用旧列:-)
  • @ZoharPeled 对。另一方面,从错误类型的列中切换引用通常是删除不必要的转换代码的简单练习,所以它可能不是那么糟糕。
  • 嗯,这取决于使用它的数据库和应用程序的年龄和大小。无论如何,您的建议是正确的恕我直言。最好修复它(并且在修复与它相关的所有内容时可能会遭受一些痛苦),而不是仅仅为了懒惰而把它弄错:-)
【解决方案2】:

您的结果变量必须是可为空的类型(您不能将null 分配给DateTime)。使用DateTime.TryParseExact()。如果解析失败,赋值null,否则赋值解析后的值。

正如 DavidG 所说,这是一个 hack,实际上您应该将日期存储为 datetime 或 datetime2 SQL 类型!

using System.Globalization;

const string format = "yyyy-MM-dd hh:mm tt";
CultureInfo enUS = new CultureInfo("en-US"); 

string dateString = Eval("Date"); // e.g. "2017-11-13 02:16 PM"

DateTime? result; // final result or null stored here

DateTime parseResult;
if (DateTime.TryParseExact(dateString, format, enUS, DateTimeStyles.None, out parseResult)) {
    result = parseResult;
}
else {
    result = null;
}

// check for null before displaying
string display = result.HasValue ? result.Value.ToString(format) : "null";

.net Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多