日期时间转换给出错误

时间:2017-07-13 09:50:51

标签: c#

认为我是c#的初学者 我在预先开发的软件(C#.Net)中做了一些更改,我们按日期保存数据,目前在插入查询(在c#中构建)我们通过GETDATE()来保存今天的日期,但现在我们必须保存数据在不同的日期的基础上 当我在c#中构建查询时,我将日期时间变量传递给查询 转换后,转换如下

Date_Stamp = DateTime.ParseExact(dt.Rows[0][0].ToString(), "MM/dd/yyyy HH:mm:ss tt", new CultureInfo("en-IN"));

但它显示错误“字符串未被识别为有效的DateTime。”。

转换的原因是因为这些日期字段以格式ToString("yyyy-MM-dd"));

显示

2017-07-13 14:56:30.233将于2017年3月13日(根据要求)给出。我们不能改变这部分代码,因为它在很多地方被使用,很难改变。

问题是 变量存储值为

2017-12-07 00:00:00.000
2017年12月7日转换后给出的错误[错误 - 需要作为12-jul-2017]

GETDATE将值存储为

2017-07-12 14:56:30.233

在转换后将于2017年7月12日正式开始

我知道在存储数据时sql server中没有日期时间格式

但我们可以将变量[2017-12-07]的值存储为[2017-07-12]吗? GETDATE()如何以年 - 月 - 日期格式给出日期 ?

1 个答案:

答案 0 :(得分:2)

.NET和SQL Server的日期相关类型都没有任何格式。所有这些都是二进制值,就像整数和小数一样。格式仅在显式或隐式转换为字符串或从字符串解析时才适用。

假设您的查询看起来像SELECT GETDATE(), ...并且您将结果加载到DataTable,则值将返回为DateTime值。如果您使用强类型DataTable,则可以使用该值。使用通用DataTable时,该值将被装箱并作为对象返回。

您只需将字段值转换为DateTime

即可
Date_Stamp = (DateTime)dt.Rows[0][0];

这也适用于datedatetime2类型。 datetimeoffset返回DateTimeOffsettime返回TimeSpan

原始问题是由于首先使用当前区域性dt.Rows[0][0].ToString()将字段值格式化为字符串而引起的。然后调用ParseExact尝试使用不同的格式解析它。一个简单的DateTime.Parse(dt.Rows[0][0].ToString())会起作用(即使它会浪费),因为DateTime.ParseDateTime.ToString()都使用相同的文化。

<强>更新

从表中读取日期字段没有问题 - 使用适当的日期类型返回值。例如,如果表的架构是:

,则运行SELECT StartDate from ThatTable将返回DateTime
CREATE TABLE ThatTable
(
    ID int,
    StartDate datetime
)

如果将日期作为字符串存储在VARCHAR列中,而不是使用正确的类型,则会导致问题。这是一个需要修复的严重错误。有 NO 保证可以将字符串解析为日期,或者它们遵循相同的格式。对于某些错误的应用程序代码来说,使用例如DateTime.Now.ToString()并在其中存储本地化的字符串非常容易。

即使格式相同,也只是浪费和不可靠。该字符串比同等类型占用更多存储空间,引入转换问题,阻止使用日期函数,并且服务器无法对查询和索引应用日期优化。

相关问题