认为我是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()如何以年 - 月 - 日期格式给出日期 ?
答案 0 :(得分:2)
.NET和SQL Server的日期相关类型都没有任何格式。所有这些都是二进制值,就像整数和小数一样。格式仅在显式或隐式转换为字符串或从字符串解析时才适用。
假设您的查询看起来像SELECT GETDATE(), ...
并且您将结果加载到DataTable,则值将返回为DateTime
值。如果您使用强类型DataTable,则可以使用该值。使用通用DataTable
时,该值将被装箱并作为对象返回。
您只需将字段值转换为DateTime
:
Date_Stamp = (DateTime)dt.Rows[0][0];
这也适用于date
和datetime2
类型。 datetimeoffset
返回DateTimeOffset
。 time
返回TimeSpan
。
原始问题是由于首先使用当前区域性dt.Rows[0][0].ToString()
将字段值格式化为字符串而引起的。然后调用ParseExact尝试使用不同的格式解析它。一个简单的DateTime.Parse(dt.Rows[0][0].ToString())
会起作用(即使它会浪费),因为DateTime.Parse
和DateTime.ToString()
都使用相同的文化。
<强>更新强>
从表中读取日期字段没有问题 - 使用适当的日期类型返回值。例如,如果表的架构是:
,则运行SELECT StartDate from ThatTable
将返回DateTime
CREATE TABLE ThatTable
(
ID int,
StartDate datetime
)
如果将日期作为字符串存储在VARCHAR列中,而不是使用正确的类型,则会导致问题。这是一个需要修复的严重错误。有 NO 保证可以将字符串解析为日期,或者它们遵循相同的格式。对于某些错误的应用程序代码来说,使用例如DateTime.Now.ToString()
并在其中存储本地化的字符串非常容易。
即使格式相同,也只是浪费和不可靠。该字符串比同等类型占用更多存储空间,引入转换问题,阻止使用日期函数,并且服务器无法对查询和索引应用日期优化。