C# 日期时间转换给定错误

C# 日期时间转换给定错误,c#,C#,我是c语言的初学者 我在一个预先开发的软件C.Net中做了一些更改,我们按日期保存数据,目前在C中的insert query build中,我们传递GETDATE以保存今天的日期,但现在我们必须根据不同的日期保存数据。 当我在c中构建查询时,我将一个datetime变量传递到查询中 转换后,转换如下 但它显示错误字符串未被识别为有效的DateTime 转换的原因是因为这些日期字段以字符串YYY MM dd格式显示 根据要求,前端将给出2017-07-13 14:56:30.233作为2017年7

我是c语言的初学者 我在一个预先开发的软件C.Net中做了一些更改,我们按日期保存数据,目前在C中的insert query build中,我们传递GETDATE以保存今天的日期,但现在我们必须根据不同的日期保存数据。 当我在c中构建查询时,我将一个datetime变量传递到查询中 转换后,转换如下

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

转换的原因是因为这些日期字段以字符串YYY MM dd格式显示

根据要求,前端将给出2017-07-13 14:56:30.233作为2017年7月13日。我们无法更改这部分代码,因为它在很多地方都被使用,很难更改

问题是 变量将值存储为

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

GETDATE将值存储为

2017-07-12 14:56:30.233

在2017年7月12日转换之后

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

但是我们可以将变量[2017-12-07]中的值存储为[2017-07-12]吗? GETDATE如何以年-月-日期格式为我们提供日期
?

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

假设您的查询类似于SELECT GETDATE。。。当您将结果加载到DataTable中时,这些值将作为DateTime值返回。如果您使用的是强类型数据表,那么只需使用该值即可。对于通用数据表,该值将被装箱并作为对象返回

您只需将字段值强制转换为DateTime:

这也适用于date和datetime2类型。datetimeoffset作为datetimeoffset返回。时间以TimeSpan的形式返回

原始字段中的问题是由于使用当前区域性dt.Rows[0][0]将字段值格式化为字符串而导致的。首先是ToString。然后调用ParseExact,尝试使用不同的格式对其进行解析。一个简单的DateTime.Parsedt.Rows[0][0]。ToString可能会工作,尽管这会造成浪费,因为DateTime.Parse和DateTime.ToString都使用相同的区域性

更新

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

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


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

DateTime没有格式。这是一个二进制值。这同样适用于SQL Server—GETDATE没有格式。这是一个日期时间值。仅当您将其转换为字符串或尝试从字符串解析时,格式才适用。如果使用不同的文化,同一日期的显示方式也会不同。首先,为什么要将值转换为字符串?只需将其转换为DateTime:DateTimedt.Rows[0][0]@PanagiotisKanavos我没有提到我自己,我正在这里寻找解决方案,您做到了:dt.Rows[0][0]。ToString。你为什么这么做?最有可能的值是DateTimealready@PanagiotisKanavos这种转换是因为ParseExact方法需要第一个参数作为字符串,而不是DateTimeok,而不是ToString YYY MM dd如何显示两种不同的转换(如果sql server中存储的日期没有任何格式).NET和sql server都没有任何特定于语言的格式)。MySQL、Postgres、Oracle和DB2也不例外。日期是二进制值。如果你不得不处理格式问题,那一定是出了问题。也许您将DateTime作为字符串而不是DateTime传递。或者使用字符串连接而不是使用参数创建查询我仍然不知道您在说什么,但如果我在插入作为参数之前将日期转换为date_Stamp.ToStringdd-MM-yyyy,则它会在sql表中以不同的格式显示日期,这与所需的GETDATE store as 2017-07-13相同,现在,我不必在这么多方面进行转换places@ThePerson我不会重复datetime没有格式。如果避免使用字符串,则不必在任何位置执行任何转换。您还没有发布查询或表模式,因此无法提供更多帮助。如果必须执行任何转换,如果必须调用
解析或PaseSc精确或CAST,你有bug @ PANAGIOTIS KANAVOS,这对我来说所有问题都解决了,谢谢你的时间,可能你只坚持SQL部分,需要考虑C部分也按问题。现在没关系了。再次感谢
Date_Stamp = (DateTime)dt.Rows[0][0];
CREATE TABLE ThatTable
(
    ID int,
    StartDate datetime
)