【发布时间】:2016-03-01 21:20:46
【问题描述】:
目标
我正在使用 MS Access 数据库。我需要确定用户输入错误的 DateCollected 的情况。具体来说,当用户输入 mm/dd/yyyy 而不是 dd/mm/yyyy 时。这些必须在事后找到,因为在入口点没有数据验证。
我有一个参考日期,DateEntry,我知道它是正确的,因为它带有数据库的时间戳。我已经确定了这些验证收集日期的方法:
- 如果日期 >12,用户不会意外将 dd/mm/yyyy 输入为 mm/dd/yyyy。
- DateCollected 不能在 DateEntry 之后。收集总是先发生。
- 查看 DateCollected 和 DateEntry 之间的分布。如果它大于 60 天,我怀疑输入错误。为了确认,我颠倒了月份和日期来创建一个 NewDate,如果重新计算的点差小于 60 天,我可以对错误进行分类。
查询
SELECT [T].[DateCollected],
[T].[DateEntry],
[T].[DateEntry]-[T].[DateCollected] AS Spread,
DateSerial(Year([T].[DateCollected]),Day([T].[DateCollected]),Month([T].[DateCollected])) AS NewDate,
[T].[DateEntry]-[NewDate] AS NewSpread
FROM T
WHERE ((Day([T].[DateCollected])<=12))
ORDER BY [T].[DateEntry]-[T].[DateCollected] DESC
输出
| DateCollected | DateEntry | Spread | NewDate | NewSpread |
-------------------------------------------------------------------
| 12/02/2004 | 17/12/2004 | 309 | 02/12/2004 | 15 |
| 11/02/2009 | 03/12/2009 | 295 | 02/11/2009 | 31 |
| 12/05/2008 | 19/02/2009 | 283 | 05/12/2008 | 76 |
| 10/01/2010 | 14/10/2010 | 277 | 01/10/2010 | 13 |
| 11/12/2007 | 26/06/2008 | 198 | 12/11/2007 | 227 |
| 03/07/2007 | 20/11/2007 | 140 | 07/03/2007 | 258 |
| 12/04/2008 | 28/08/2008 | 137 | 04/12/2008 | -98 |
| 05/06/2013 | 15/05/2013 | -21 | 15/05/2013 | 9 |
| 01/10/2005 | 18/01/2005 | -256 | 18/01/2005 | 8 |
问题
我在以这种方式编写查询时遇到了麻烦,因为由于某种原因,我无法将过滤器应用于 NewSpread 列。例如,我想过滤掉 NewSpread 为负数(违反上述规则#2)或 NewSpread>Spread(不是由混合 mm 和 dd 引起的)的任何情况。当我尝试包含过滤器时,例如
WHERE ((Day([T].[DateCollected])<=12)) AND (([T].[DateEntry]-[NewDate])>0)
我在询问 NewDate 的参数值时遇到错误。
问题
如何修复我的查询,以便它允许对 NewSpread 列进行过滤?
有没有更好的方法来查找输入为 mm/dd/yyyy 而不是 dd/mm/yyyy 的日期?
【问题讨论】:
-
你能编辑你的帖子并输入确切的错误信息吗?
-
您不能使用名称
NewSpread,因为它在过滤时不存在,您必须使用完整的表达式,例如([T].[DateEntry]-[NewDate]) > 10 -
那是否意味着 NewDate 也不存在?
-
是的,
where评估期间 NewDate 不存在