SQL-запрос для выбора записей, в которых поле даты является определенным номером недели - PullRequest
0 голосов
/ 07 ноября 2018

У меня нет собственного "синтаксиса сценария" для моего приложения. Он предназначен для создания простых отчетов из базы данных Microsoft Access с использованием JET. Вот простой пример:

REQUIRES "Min number of away talks:" AS $iMinNumAwayTalks
LOOP FROM "Home Talks" NODATERANGE WHERE "Last Given" ISMOREOREQUAL "$Today"  SORTBY "Last Given"
    SHORTDATE_FIELD "Last Given"
    TAB =5>
    TEXT "Week: "
    VARIABLE_FIELD "Last Given" "$iWeekNo#CUSTOMDATE[%W]"
    TEXT "$iWeekNo"
    $iAwayTalkCount = 0
    LOOP FROM "Away Talks" NODATERANGE WHERE "Talk Date" ISMOREOREQUAL "$Today"  SORTBY "Talk Date"
        VARIABLE_FIELD "Talk Date" "$iAwayWeekNo#CUSTOMDATE[%W]"
        IF "$iAwayWeekNo" IS "$iWeekNo"
            $iAwayTalkCount = $iAwayTalkCount + 1
        END_IF
    END_LOOP
    TAB =10>
    TEXT "# Away: "
    TEXT "$iAwayTalkCount"
    TAB =15>
    TEXT "$iMinNumAwayTalks"
    TEXT " Exceed? "
    IF "$iAwayTalkCount" ISMORE "$iMinNumAwayTalks"
        TEXT "Yes"
    END_IF
    IF "$iAwayTalkCount" ISLESSOREQUAL "$iMinNumAwayTalks"
        TEXT "No"
    END_IF
    EOL
END_LOOP

По сути, это две таблицы, чтобы определить, сколько записей имеют одинаковые Номер недели (начало Понедельник ) для указанных полей.

Мой вопрос относится к этому запросу, который я использовал:

LOOP FROM "Away Talks" NODATERANGE WHERE "Talk Date" ISMOREOREQUAL "$Today"  SORTBY "Talk Date"

Недостатком этого запроса является то, что он выбирает все записи, превышающие сегодняшний, и затем я должен изучить каждую запись, чтобы узнать, имеет ли поле «Дата разговора» тот же номер недели.

Results

Теперь мой синтаксис сценария также поддерживает циклы raw SQL. Так можно ли с помощью необработанного SQL-запроса Microsoft Access JET:

Выбрать все Выездные переговоры , где Дата разговора - Неделя X (где Неделя начинается с недели Понедельник )?

Я пытался выполнить ручной тест в Access 2016 с критериями:

SELECT [Away Talks].[Talk Date]
FROM [Away Talks]
WHERE ((DatePart('ww',[Talk Date],'vbMonday')=45));

Но у меня есть ошибка:

Access Error

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Ваш критерий в окне конструктора запросов предоставляет номер недели, а не дату, поэтому вам нужно создать поле недели без применения критериев - попробуйте вставить свой код в редактор запросов SQL

SELECT [Away Talks].[Talk Date]
FROM [Away Talks]
WHERE ((DatePart('ww',[Talk Date], 2)=45));

See below

0 голосов
/ 07 ноября 2018

Вы предоставляете vbMonday в своем запросе в виде строкового литерала ('vbMonday') вместо числового значения.

К сожалению, вы не можете использовать константу VBA vbMonday в запросе, поэтому вам придется использовать ее числовой эквивалент: 2

Чтобы узнать это числовое значение самостоятельно, вы можете ввести ?vbMonday в непосредственном окне VBE или, например, открыть окно «Обозреватель объектов», нажав F2 в VBE. Там вы можете найти vbMonday и увидеть его числовое значение внизу окна.

...