C# 如何将SQLServer中的varchar(20)转换为C中的datetime?
我将日期作为varchar存储在SQLServer中,以便它们在C逐实体框架中成为字符串 然后我尝试将其转换为date,但代码引发了一个异常 在SQL Server中:C# 如何将SQLServer中的varchar(20)转换为C中的datetime?,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我将日期作为varchar存储在SQLServer中,以便它们在C逐实体框架中成为字符串 然后我尝试将其转换为date,但代码引发了一个异常 在SQL Server中: CREATE TABLE [dbo].[Achievements] ( ... [DatePerformance] [VARCHAR](20) NULL, ) 日期以以下格式存储:2019年4月25日 在C中: 我试过: List<Achievements> res = db.Ach
CREATE TABLE [dbo].[Achievements]
(
...
[DatePerformance] [VARCHAR](20) NULL,
)
日期以以下格式存储:2019年4月25日
在C中:
我试过:
List<Achievements> res = db.Achievements.Where(x => DateTime.Parse(x.DatePerformance) <= DateTime.Today.Date).ToList();
以及:
代码抛出:
System.NotSupportedException:'LINQ to Entities无法识别方法'System.DateTime ParseSystem.String'方法,并且无法将此方法转换为存储表达式。'
正如其他人在评论中所说,在SQL中将日期存储为varchar的好理由是零 你说: 所以它们在C的实体框架中变成了字符串 一旦你在C中得到了日期,你就可以用一个.ToString轻松地完成这个任务 但是。。。至于您的特定错误,它告诉您的是,您不能在实体框架LINQ语句中使用此方法。最好将LINQ语句视为查询。因为,事实上,它需要能够将LINQ语句转换为实际的SQL查询。不能在SQL查询中使用DateTime.Parse,因此它会抛出此错误 如果您真的必须将日期作为varchar存储在数据库中,这是一个糟糕的想法,那么我看不到一个真正简单的解决方案。马上,我会告诉您首先创建列表,然后循环浏览:
List<Achievements> res = db.Achievements.ToList();
然后:
但这是一种非常笨拙的解决方案:只需将日期存储为日期 修正你的数据模型!不要将日期作为字符串存储在数据库中。使用这个秘密和难以猜测的日期来存储它们。这些[时态]数据类型的存在有很多原因,其中一个原因是它们恰恰阻止了您现在正在处理的问题:在没有自然表示的数据类型中表示的重要性ISO-8601是一种标准表示,但与数值相比仍然是任意的。将日期存储为字符串会产生许多问题,例如国际化问题、排序问题,当然还有您正在处理的这个问题。将它们存储为日期,这将为您省去许多麻烦。您无法使用该字符串格式搜索日期范围,也无法确保所有字符串的格式相同。另一方面,日期值是只需要3个字节的二进制值,排序工作与预期一样,索引很容易,并且无法插入无效日期。没有理由将日期存储为字符串。在SQL Server中,您可以使用try\u convert。如果转换失败,它将返回NULL而不是抛出错误。例如选择try_convertdate,'25/04/2019',103。。。
List<Achievements> res = db.Achievements.Where(x => DateTime.ParseExact(x.DatePerformance, "dd/MM/yyyy",
CultureInfo.InvariantCulture) <= DateTime.Today.Date).ToList();
List<Achievements> res = db.Achievements.ToList();
foreach (var achievement in res)
{
if (DateTime.Parse(achievement.DatePerformance) <= DateTime.Today.Date)
{
// do something here
}
}