【问题标题】:Linq-To-Sql convert string to date with specific formatLinq-To-Sql 将字符串转换为具有特定格式的日期
【发布时间】:2015-10-23 09:36:45
【问题描述】:

我将日期存储为格式不太好的字符串 (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 数据类型转换为 datetime 数据类型导致值超出范围。

可能是因为它把 105 参数放到了 convert 方法中。我尝试了不同的解析方法(Parse、ParseExact 和 Convert.ToDateTime 与 IFormatProvider),但所有这些都给我或多或少的错误:

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

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

【问题讨论】:

    标签: c# sql linq linq-to-sql


    【解决方案1】:

    虽然这不是最好的做法,但如果它有效,那就顺其自然吧,我建议你在你的表中创建一个视图

      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 格式。

    【讨论】:

    • 这是一个可能的解决方案,但我更感兴趣的是用 linq 解决它,而不必在数据库中创建新的东西。
    【解决方案2】:

    使用AsEnumerableDateTime.ParseExact 在本地转换它们可能会更好。

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

    【讨论】:

    • 是的,我想过这个。但是这个解决方案会将所有数据加载到内存中对吗?
    • 是的。因此,从性能的角度来看,我认为 Blaire Andaloc 的答案比我的要好:)
    【解决方案3】:

    您应该能够手动解析出部分并构建一个新的 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 格式的日期

    【讨论】:

      猜你喜欢
      • 2022-12-25
      • 2018-08-30
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多