[英]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格式。
使用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
选择新的{...}
yourdate是字符串dd-MM-yyyy格式的日期
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.