为什么在日期之间搜索时访问返回不一致的结果?

时间:2015-09-24 02:45:15

标签: c# sql ms-access-2007

所以我有一小部分软件正在运行,以帮助接收和库存ATM。我做了一个报告,在日期A和B之间提取项目条目。我使用MonthCalendar控件,然后使用控件的.SelectionStart.SelectionEnd属性作为用户提取日期范围通常会选择一周(周一至周五)进行报道。

继承我发送到Access DB的SQL:

InvDB.GetQuery("
  SELECT
    [_Date],Commodity,Gross,Net,Description
  FROM
    Tags
  WHERE
    Format([_Date],'yyyy') = '" + DateTime.Now.Year.ToString() + "' AND
    Format([_Date],'m/d/yyyy') Between #" + monthCalendar1.SelectionStart.ToString("M/dd/yyyy") + "# AND #" + monthCalendar1.SelectionEnd.ToString("M/dd/yyyy") + "# 
    AND NOT Category = 'Finished Goods' 
    ORDER BY [_Date] Asc",
"Tags");

日期以这种格式存储:“9/​​1/2015 10:31:50 AM”

我从来没有能够让SQL日期函数最初工作,所以我不得不求助于这种方法,我很遗憾地意识到这种方法效率很低......

首先我选择年份比较的原因是因为当我选择日期范围时,访问权限返回与日期相关的所有年份。不仅是属性返回的那个。 (我也知道如果在多年之间进行交易会导致问题)

最后我问这里的问题的原因是,当用户选择日期,并试图获取日期之间的项目...返回的选择,是如此随机...我从未见过这个SQL返回的模糊结果的类型......我甚至看不到它的模式。我选择了一个星期,它只给出了那一周的5天中的3天和前一个月的前两周...另一周的选择是准确的...另一个,给出了5天中的2天周...

编辑 - 根据以下建议,我现在推送查询参数。我还在测试后删除了SQL Format(),但仍然产生了相同的随机性。到目前为止,这个简单的查询正在返回准确的信息。

SELECT
  [_Date],Commodity,Gross,Net,Description
FROM
  Tags
WHERE
  [_Date] Between ? AND ?
  AND NOT Category = 'Finished Goods' 
ORDER BY 
  [_Date] Asc

1 个答案:

答案 0 :(得分:1)

尽量不要将[_Date]转换为字符串。转换它时,您无法正确使用BETWEEN作为日期。