【问题标题】:LINQ to SQL selecting records and converting datesLINQ to SQL 选择记录和转换日期
【发布时间】:2012-02-03 09:46:28
【问题描述】:

我正在尝试使用 Linq to SQL 根据日期从表中选择记录。不幸的是,日期被分成两个表 - Hours 表包含日期,而相关的 JobTime 表在两列中包含月份和年份。

我有以下疑问:

Dim qry = From h As Hour In ctx.Hours Where Convert.ToDateTime(h.day & "/" & h.JobTime.month & "/" & h.JobTime.year & " 00:00:00") > Convert.ToDateTime("01/01/2012 00:00:00")

这给了我错误“将表达式转换为数据类型日期时间的算术溢出错误。”

查看 SQL Server Profiler 中的 SQL 查询,我看到了:

exec sp_executesql N'SELECT [t0].[JobTimeID], [t0].[day], [t0].[hours] 
FROM [dbo].[tbl_pm_hours] AS [t0]
INNER JOIN [dbo].[tbl_pm_jobtimes] AS [t1] ON [t1].[JobTimeID] = [t0].[JobTimeID]
WHERE (CONVERT(DateTime,(((((CONVERT(NVarChar,[t0].[day])) + @p0) + (CONVERT(NVarChar,COALESCE([t1].[month],NULL)))) + @p1) + (CONVERT(NVarChar,COALESCE([t1].[year],NULL)))) + @p2)) > @p3',N'@p0 nvarchar(4000),@p1 nvarchar(4000),@p2 nvarchar(4000),@p3 datetime',@p0=N'/',@p1=N'/',@p2=N' 00:00:00',@p3='2012-01-31 00:00:00'

我可以看到它没有传递正确搜索的日期,但我不确定如何更正它。

有人可以帮忙吗?

谢谢, 艾玛

【问题讨论】:

    标签: sql linq


    【解决方案1】:

    错误的直接原因可能与this issue有关。

    正如那里所说,您使用的转换是构建查询的一种非常低效的方式。最重要的是,它效率低下,因为表达式不是sargable。 IE。您在比较中使用数据库列的计算值,这会禁用查询分析器使用索引跳转到各个列值。因此,您可以尝试通过修改直接原因来修复错误,但我认为最好以仅在比较中使用单列值的方式重写查询。

    我已经在 C# 中解决了这个问题:

    var cfg = new DateTime(12,6,12);
    int year = 12, month = 6, day = 13; // Try some more values here.
    
    // Date from components > datetime value?
    bool gt = (
        year > cfg.Year || (
            (year == cfg.Year && month > cfg.Month) || (
                year == cfg.Year && month == cfg.Month && day > cfg.Day)
        )
    );
    

    您会发现它并不像最初看起来那么简单,但它确实有效。还有更多的比较需要解决,但我相信使用索引的能力会很容易超过这个。

    一种更直接但不可分割的方法是使用可排序的日期,例如 20120101 并比较它们(作为整数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多