2017-02-14 3 views
1

Глядя на замену части кода 2017-02-14 на дату вчерашнего дня как функцию, так как я хочу использовать этот запрос без необходимости его ежедневного изменения. Я пробовал адаптировать другой код, найденный на форумах, но никуда не денусь.Добавление даты() с суффиксом в запрос sqlite3

Я ищу базу данных, пытаясь найти время, когда определенное событие началось в предыдущий день, когда возникает необходимость в подобном выражении и подчеркиваниях. Я попытался использовать функцию date() sqlite3, но не смог найти способ добавить суффикс «__ __ __», чтобы найти конкретную запись.

Кроме того, я недостаточно знаком с bash, чтобы передать date +'%Y-%m-%d' запросу и добавить суффикс «__ __ __» до конца, чтобы найти запись, которую я ищу. ,

#!/bin/bash 
yesterday=$(date -d yesterday +'%Y-%m-%d __:__:__')     
startDetails=sqlite3 hub.db 'select substr(timestamp,12,19) 
           from OET where entryID="0" 
           and timestamp like "2017-02-14 __:__:__";' 
stopDetails=sqlite3 hub.db 'select substr(timestamp,12,19) 
          from OET where entryID="5" 
           and timestamp like "'"$yesterday"'";' 

echo "Start: " $startDetails "Finish: "$stopDetails 
exit 0 
fi 

Я скопировал в упрощенной форме то, что я пытаюсь сделать. В текущем состоянии первый запрос возвращается правильно, перечисляя два начальных времени для дня, однако второй запрос ничего не возвращает, запуск этого сценария в debug возвращает следующие результаты.

+ $'\r' 
checkWebID.sh: line 2: $'\r': command not found 
++ date -d yesterday '+%Y-%m-%d __:__:__' 
' yesterday='2017-02-14 __:__:__ 
++ sqlite3 hub.db 'select substr(timestamp,12,19) 
        from OET where entryID="0" 
        and timestamp like "2017-02-15 __:__:__";' 
+ Details='04:49:01 
'4:07:42 
";'sqlite3 hub.db 'select substr(timestamp,12,19) 
        from OET where entryID="5" 
        and timestamp like "2017-02-14 __:__:__ 
+ StopDetails=$'\r' 
+ $'\r' 
checkWebID.sh: line 6: $'\r': command not found 
+ echo 'Start: ' 04:49:01 $'14:07:42\r' 'Finish: ' $'\r\r' 
Finish: :49:01 14:07:42 
+ exit $'0\r' 
: numeric argument required: 0 
+0

Сообщения об ошибках с '$ '\ r'' в них указывают на то, что вы играли на компьютере с Windows, и ваш сценарий содержит концы строк CRLF (DOS), а не окончания строк в Unix-подобных NL (LF) , Исправьте формат файла для работы как Unix, а не DOS (в Vim, ': set fileformat = unix', вероятно, выполнит эту работу, есть много других способов сделать это, и многочисленные вопросы о SO, где изменение окончания строки является релевантным Исправлено. –

+0

Используя команду dos2unix, я смог преобразовать формат файла из DOS в Unix, запуск скрипта теперь возвращает желаемые результаты. Спасибо за вашу помощь, вы спасли меня, чтобы тащиться через много грязи. Cheers – selfcontained

ответ

2

Предполагая, что вы используете GNU date, это может быть столь же просто, как:

yesterday=$(date -d yesterday +'%Y-%m-%d __:__:__') 
startDetails=`sqlite3 hub.db 'select substr(timestamp,12,19) 
           from OET where entryID="0" 
           and timestamp like "'"$yesterday"'";'` 

Кавычки должны быть тщательно спланированных. Во фрагменте:

'select … like "'"$yesterday"'";' 

первая двойная кавычка - буква; следующая одиночная кавычка завершает однокаскадную строку; "$yesterday" содержит значение в переменной оболочки yesterday в двойных кавычках (эти кавычки не являются необязательными из-за пробела в значении $yesterday - но вы можете изменить все, чтобы они были необязательными); то одиночная кавычка запускает (возобновляет) одну строку с кавычками, двойная кавычка является частью строки, а затем одиночная кавычка снова заканчивает одну кавычку.

В общем, вы должны использовать $(…) обозначения в предпочтении к обратные кавычки, особенно если вы планируете обсуждать вещи в уценки (но есть технические причины предпочитать $(…) независимо от SO и уценки).

+0

Спасибо для вашего ответа, прояснил практику, однако, он не совсем сработал. Я использую GNU/linux Ubuntu 11.04 Я обновил исходный вопрос – selfcontained

+0

Первым шагом в отладке является печать - в этом случае, вероятно, sh -x yourscript.sh', чтобы увидеть, что находится в '$ вчера' (для меня, 2017-02-14T19: 15: 37,' date -d вчера + '% Y /% m /% d __: __ : __ ''команда, созданная' 2017/02/13 __: __: __', что и было редактор Вы получили эквивалент? Вам также удалось потерять обратные тики в ваших командах - это ошибка транскрипции при обновлении вопроса? (Кроме того, вы, как правило, не должны удалять исходный материал из вопроса после получения ответов. Вы сохранили (более или менее) достаточно оригинала, но будьте осторожны!) –

+0

Отмечу, что ваш текущий текст и исходная версия вопроса использует '2017/02/14', а пересмотренный запрос использует' 2017-02-14' - выберите тот, который работает, и исправьте значение, сохраненное в '$ вчера', чтобы соответствовать. Это простое изменение строки формата для 'date'. В версиях 1 и 2 вашего SQL используется обозначение '/'; в версиях 3 и 4 используется обозначение '-'. Выберите свой яд, но не пытайтесь их смешивать. Конечно, возможно, что обе нотации работают. Вы также используете двойные кавычки вокруг строк в SQL; стандартный SQL требует одинарных кавычек, но я привык к RDBMS, которые не так суетливы. –

Смежные вопросы