二月来破坏了我的sql。我得到一个生成的CSV文件,该文件基本上是来自MS Access数据库的转储。我无法修改数据库。我使用 PHP 对 CSV 文件运行查询,以便为老板生成报告。以下是我尝试运行的查询(数字 1 一直工作到 2 月到来):
1) SELECT * FROM [Orders.csv] WHERE [Order Taken By Associate Surrogate #] = 1009 AND [Date/Time Taken] BETWEEN #05/01/2016# AND #05/07/2016# AND NOT [Order Status Surrogate #] = 3
2) SELECT * FROM [Orders.csv] WHERE [Order Taken By Associate Surrogate #] = 1009 AND Format([Date/Time Taken], 'MM/dd/yyyy') BETWEEN #05/01/2016# AND #05/07/2016# AND NOT [Order Status Surrogate #] = 3
3) SELECT * FROM [Orders.csv] WHERE [Order Taken By Associate Surrogate #] = 1009 AND Format([Date/Time Taken], 'mm/dd/yyyy hh:nn:ss') BETWEEN #05/01/2016 00:00:00# AND #05/07/2016 23:59:59# AND NOT [Order Status Surrogate #] = 3
当我运行查询 1 时,我没有得到任何结果;而 2 和 3 返回所有内容。如果我运行一天的查询 2,那么它会返回正确的结果。查询中该时间段有 71 条记录。
查询日期并显示正确结果的正确方法是什么?
最后一点信息:
'Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq='.$file.';Extensions=asc,csv,tab,txt;Extended Properties="Excel 8.0;IMEX=1"'
您报告驱动程序将[Date/Time Taken]
字段视为日期/时间数据类型。
因此,在将 Format()
函数与日期/时间值进行比较时,不应使用它。 Format()
返回一个字符串,而不是日期/时间值。
访问会将#05/01/2016#
解释为 5 月 1 日。 如果您实际上打算表示 1 月 5 日,请使用 #2016-01-05#
以避免混淆哪个部分是月份,哪个是日期。
有了这两个建议,请在WHERE
子句中使用这样的条件......
[Date/Time Taken] BETWEEN #2016-01-05# AND #2016-07-05#
或者如果我猜错了日期...
[Date/Time Taken] BETWEEN #2016-05-01# AND #2016-05-07#