繁体   English   中英

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

[英]Linq-To-Sql convert string to date with specific format

我有一个日期存储为一个不太好格式的字符串(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),但所有这些都给了我或多或少的错误:

方法'System.DateTime ParseExact(System.String,System.String,System.IFormatProvider)'没有支持的SQL转换。

所以我的问题是,有没有一种很好的方法来转换Linq中带有“奇怪”日期格式的日期,以便我可以使用T-SQL? 我已经有了一个“工作”的解决方案,但我想知道是否有任何方法可以让Linq以一种很好的方式解释它?

虽然这不是最佳实践,但如果它有效,那么请使用它,我建议你在表中创建一个View

  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

选择新的{...}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM