2015-06-23 4 views
1

У меня есть таблица, на которой я запускаю запрос, который я экспортирую в Excel.Использование даты в CreateQueryDef

Вот пример:

Таблица: Продукты

Item | Price | Limit_Date | 
------------------------------- 
Carrot | 0.80 | 08/07/2015 | 
Salmon | 4.30 | 01/07/2015 | 
Biscuits | 2.40 | 15/12/2015 | 
Milk  | 1.00 | 25/06/2015 | 

И я запускаю этот код в VBA:

код

Dim cdb as DAO.Database 
Dim qdf as DAO.QueryDef 

Set cdb = CurrentDb 

Const xlsxPath = "C:\Users\Tom\Documents\Foo.xlsx" 

Set qdf=cdb.CreateQueryDef("Omnomnomnom", _ 
     "SELECT Item, Price FROM Food WHERE Limit_Date >= [pDate];") 
Set qdf=Nothing 

DoCmd.TransferSpreadsheet acExport, acExport, acSpreadsheetTypeExcel112Xml, "Omnomnomnom", xlsxPath, True 
DoCmd.DeleteObject acQuery, "Omnomnomnom" 

Это хорошо работает как это , но я хочу заменить параметр [pDate] на твердую дату, чтобы доступ больше не запрашивал его.

Вот что я пытался до сих пор:

  • Использование #01/07/2015#

  • Использование DateValue("1 July 2015") и без # вокруг

  • Использование Format("01/07/2015", "dd/mm/yyyy") и без # вокруг

Для каждого из этих случаев запрос возвращает все в таблице, как если бы он не учитывал дату. Я уже проверил, что мое поле Limit_Date - дата/время в моей таблице. И ошибки не появляются.

Запрос работает только в том случае, если я сохраняю [pDate], и я вручную вводим 01/07/2015, когда мне подскажет доступ.

ответ

0

Даты в Access должны быть окружены тегами #, чтобы он распознал дату, в которую вы прошли. Другим важным фактором, который следует учитывать, является то, что JET требует, чтобы формат даты был mm/dd/yyyy, в отличие от обычного dd/mm/yyyy. Поэтому ваша проблема заключается в том, что вы используете #, но неправильный формат или правильный формат без #. Так что попробуйте использовать что-то вроде,

Dim cdb as DAO.Database 
Dim qdf as DAO.QueryDef 

Set cdb = CurrentDb 

Const xlsxPath = "C:\Users\Tom\Documents\Foo.xlsx" 

Set qdf=cdb.CreateQueryDef("Omnomnomnom", _ 
     "SELECT Item, Price FROM Food WHERE Limit_Date >= #07/01/2015#;") 
Set qdf=Nothing 

DoCmd.TransferSpreadsheet acExport, acExport, acSpreadsheetTypeExcel112Xml, "Omnomnomnom", xlsxPath, True 
DoCmd.DeleteObject acQuery, "Omnomnomnom" 

Существует некоторая интересная статья с International Date Formats in Access, Аллен Браун. Надеюсь это поможет !

+0

Он работает сейчас, но вы можете объяснить мне, почему Access выполняет мой запрос без каких-либо проблем, как я вручную ввести 01/07/2015, когда он просит pdate? Разве это не проблема в основном то же самое? – Tom

+0

Нет, потому что, когда вы используете параметр Parameter, механизм DB, сопоставляет тип данных с переданным параметром. Когда вы указываете значения даты жесткого кодирования, компилятор не знает, каков тип данных до момента выполнения. Именно по этой причине спецификаторы '#' инструктируют, что это тип Date, a''' для типа String и что-то еще - тип Number. При использовании '#' он строит данные в американском формате, что делается автоматически при использовании построителя запросов или параметров. Надеюсь это поможет ! – PaulFrancis

0

Вы должны отформатировать дату как строковое выражение будет сцеплено с SQL:

Dim sDate As String 

sDate = Format(pDate, "yyyy\/mm\/dd") 

Set qdf=cdb.CreateQueryDef("Omnomnomnom", _ 
    "SELECT Item, Price FROM Food WHERE Limit_Date >= # & sDate & "#;")