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以一种很好的方式解释这一点?
虽然这不是最佳实践,但如果它有效,那么就这样吧,我建议您在表中创建一个视图
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格式。
使用AsEnumerable
和DateTime.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格式的日期