strftime в sqlite конвертировать в postgres - PullRequest
2 голосов
/ 24 августа 2011

Я наткнулся на функцию в sqlite, которую мне нужно преобразовать в синтаксис postgres.Это date(date, '-'||strftime('%w',date)||' days').

Может кто-нибудь помочь мне преобразовать этот sqlite-сегмент в postgres?

Ответы [ 3 ]

3 голосов
/ 24 августа 2011

Этот SQLite:

date(date, '-' || strftime('%w', date) || ' days')

Is, AFAIK, вычитая число дней в неделе (то есть 0 для воскресенья, 1 для понедельника ...) из date и затем преобразовывая результат обратно в date; подробности см. в справочнике функций .

Я думаю, что эквивалент для PostgreSQL будет:

d - extract(dow from d)::int

где d - ваша дата; вычитание целого числа из даты вычитает это количество дней. Если d - это временная метка, вам может потребоваться добавить кастинг. Существует также date_trunc('week', 'd'), но он начинает нумерацию дней с понедельника, так что вы будете на единицу с этим.


Вот краткий анализ SQLite с заменой переменной date на d, чтобы избежать путаницы с функцией date():

date(d, '-' || strftime('%w', d) || ' days')

Прежде всего, || - это стандартный оператор конкатенации строк SQL. strftime функция - это форматер даты и времени общего назначения, полученный из POSIX ; спецификатор формата %w означает «день недели как число с воскресеньем, являющимся нулевым днем»; таким образом, звонок strftime дает вам 0 для воскресенья, 1 для понедельника и так далее до 6 для субботы. Если d - вторник, то вызов strftime даст 2, и все закончится как:

date(d, '-2 days')

Модификаторы для функции SQLite date имеют различные формы, но '-2 days' означает то, что вы думаете: вычтите два дня из d. В итоге получается, что d усекается до недели (где воскресенье считается первым днем ​​недели).

На стороне PostgreSQL:

d - extract(dow from d)::int

мы можем начать с extract; extract используется для извлечения определенных частей даты или времени, а dow означает «день недели как число с воскресным днем, равным нулю». Звучит знакомо? Затем ::int преобразует число DOW в целое число, и оно необходимо, потому что DOW фактически выступает в качестве значения двойной точности, и в PostgreSQL не определен оператор для вычитания двойного числа из даты; актерский состав также может быть записан в стандартной форме как cast(x as int). Когда вы вычитаете целое число из даты в PostgreSQL, вы вычитаете это количество дней; Вы можете быть более точным, говоря что-то вроде - interval '3 days', но это просто добавит больше шума в этом случае, поэтому я выбрал простоту. Если это вторник, то наша версия PostgreSQL выглядит так:

d - 2

и это так же, как:

d - interval '2 days'

И после вычитания мы вернемся в воскресенье. В PostgreSQL также есть date_trunc, но это будет урезано до понедельника, а не воскресенья.

2 голосов
/ 15 марта 2013

Учитывая формат как " 12 марта 18: 07: 22 * ​​1002 *",

Версия PostgreSQL с использованием функции to_char:

psql -c "SELECT to_char(time,'Mon DD HH24:MI:SS ') FROM mytable;" 

Версия SQLite с использованием функции strftime (с помощью awk):

sqlite3 'SELECT strftime("%s", time, "localtime") FROM mytable;' \
  |  awk '{print strftime("%b %e %H:%M:%S",$1) }' 

В предыдущем примере

  • Печатный формат будет 12 марта 18: 07: 22 * ​​1022 *
  • Столбец sqlite время был типом TEXT в виде строк ISO8601.
  • Столбец postgres time был тип time_stamp.
2 голосов
/ 24 августа 2011

% w - это день недели в виде числа с воскресенья = 0, аналогично DOW для Postgresql: SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); из http://www.postgresql.org/docs/current/static/functions-datetime.html

Строковые операции должны быть довольно простыми, но я неPostgres делал около 10 лет.

[после дополнительных исследований] Оператор ||, как я подозревал, - это конкатенация строк, начиная с http://www.sqlite.org/lang_expr.html

[после установки sqlite и postgresql]функция sqlite вычисляет воскресенье, предшествующее данной дате:

sqlite> select date('now', '-'||strftime('%w','now')||' days');
2011-08-21

мю слишком коротко дал последний фрагмент головоломки:

postgres=# select date 'now' - extract(dow from timestamp 'now')::int;
  ?column?  
------------
 2011-08-21
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...