Linq-To-Sql将字符串转换为特定格式的日期

本文关键字:定格 格式 日期 字符串 转换 Linq-To-Sql | 更新日期: 2023-09-27 18:18:53

我有一个日期存储为字符串,格式不太好(dd-MM-yyyy)。SQL服务器不能自动将其转换为日期,至少不能使用其上的设置,但可以通过一些帮助来修复它。下面的SQL语句可以完美地工作:

select * from table
where convert(date,myValue,105) < GETDATE()

问题是,我如何在LINQ中做到这一点?我手动尝试了不同的东西,我测试了Linqer从我的SQL生成LINQ。这是Linqer给我的:

from table in db.table
where
  Convert.ToDateTime(myValue) < DateTime.Now
select new {
  ...
}
问题是,当我运行上面的语句时,我得到:

将nvarchar数据类型转换为日期时间数据类型导致值超出范围。

可能是因为它将105参数丢给了convert方法。我尝试过不同的解析方法(parse, ParseExact和Convert)。ToDateTime和IFormatProvider)但所有这些都给我的错误或多或少像:

方法的系统。DateTime ParseExact(系统。字符串,系统。字符串,System.IFormatProvider)'不支持转换为SQL。

所以我的问题是,是否有一个很好的方法来转换一个日期与"奇数"日期格式在Linq,这样我就会得到工作的T-SQL?我已经有了一个"工作"的解决方案,但我想知道是否有任何方法可以让Linq以一种很好的方式解释这一点?

Linq-To-Sql将字符串转换为特定格式的日期

虽然这不是最佳实践,但如果它有效,那么就这样吧,我建议您在表中创建一个视图

  CREATE VIEW view_table 
  AS 
  select tbl_id, 
         convert(date,myValue,105) as myDate
  from table

那么从你的linq

     from table in db.view_table
        where
        Convert.ToDateTime(myDate) < DateTime.Now
   select new {
      ...
   }

,因为列myValue已经转换为105格式。

使用AsEnumerableDateTime.ParseExact进行本地转换可能会更好。

from table in db.table.AsEnumerable()
where
  DateTime.ParseExact(myValue, "dd-MM-yyyy", CultureInfo.InvariantCulture) < DateTime.Now
select new {
  ...
}

您应该能够手动解析出这些部分并构建一个新的DateTime

from table in db.table
let myValue = new DateTime(Convert.ToInt32(yourdate.Substring(6,4)),Convert.ToInt32(yourdate.Substring(3,2)),Convert.ToInt32(yourdate.Substring(0,2)))
where
  myValue < DateTime.Now

select new {…}

yourdate是字符串dd-MM-yyyy格式的日期