9.9. ÐпеÑаÑоÑÑ Ð¸ ÑÑнкÑии даÑÑ/вÑемени #
ÐÑе ÑÑÑеÑÑвÑÑÑие ÑÑнкÑии Ð´Ð»Ñ Ð¾Ð±ÑабоÑки даÑÑ/вÑемени пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 9.33, а подÑобнее они опиÑÐ°Ð½Ñ Ð² ÑледÑÑÑиÑ
подÑазделаÑ
. Ðоведение оÑновнÑÑ
аÑиÑмеÑиÑеÑкиÑ
опеÑаÑоÑов (+, * и Ñ. д.) опиÑано в ТаблиÑе 9.32. ФÑнкÑии ÑоÑмаÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑиÑ
Ñипов даннÑÑ
бÑли пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² Разделе 9.8. ÐбÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± ÑÑиÑ
ÑипаÑ
Ð²Ñ Ð¿Ð¾Ð»ÑÑили (или можеÑе полÑÑиÑÑ) в Разделе 8.5.
Ðомимо ÑÑого, Ð´Ð»Ñ Ñипов даÑÑ/вÑемени имеÑÑÑÑ Ð¾Ð±ÑÑнÑе опеÑаÑоÑÑ ÑÑавнениÑ, показаннÑе в ТаблиÑе 9.1. ÐнаÑÐµÐ½Ð¸Ñ Ð´Ð°ÑÑ Ð¸ даÑÑ Ñо вÑеменем (Ñ ÑаÑовÑм поÑÑом или без него) можно ÑÑавниваÑÑ ÐºÐ°Ðº Ñгодно, Ñогда как знаÑÐµÐ½Ð¸Ñ ÑолÑко вÑемени (Ñ ÑаÑовÑм поÑÑом или без него) и инÑеÑÐ²Ð°Ð»Ñ Ð´Ð¾Ð¿ÑÑÑимо ÑÑавниваÑÑ, ÑолÑко еÑли иÑ
ÑÐ¸Ð¿Ñ ÑовпадаÑÑ. ÐÑи ÑÑавнении даÑÑ Ñо вÑеменем без ÑаÑового поÑÑа и даÑÑ Ñо вÑеменем Ñ ÑаÑовÑм поÑÑом пÑедполагаеÑÑÑ, ÑÑо пеÑвое знаÑение задано в ÑаÑовом поÑÑе, ÑÑÑановленном паÑамеÑÑом TimeZone, и оно пеÑеÑÑиÑÑваеÑÑÑ Ð² UTC Ð´Ð»Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñо вÑоÑÑм знаÑением (внÑÑÑи Ñже пÑедÑÑавленнÑм в UTC). ÐналогиÑнÑм обÑазом, пÑи ÑÑавнении знаÑений даÑÑ Ð¸ даÑÑ Ñо вÑемени пеÑвое ÑÑиÑаеÑÑÑ ÑооÑвеÑÑÑвÑÑÑим полноÑи в ÑаÑовом поÑÑе TimeZone.
ÐÑе опиÑаннÑе ниже ÑÑнкÑии и опеÑаÑоÑÑ, пÑинимаÑÑие аÑгÑменÑÑ time или timestamp, ÑакÑиÑеÑки пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² двÑÑ
ваÑиаÑиÑÑ
: одна пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ñип time with time zone или timestamp with time zone, а вÑоÑÐ°Ñ â time without time zone или timestamp without time zone. ÐÐ»Ñ ÐºÑаÑкоÑÑи ÑÑи ваÑиаÑии здеÑÑ Ð½Ðµ ÑазделÑÑÑÑÑ. ÐÑоме Ñого, опеÑаÑоÑÑ + и * опÑеделÑÑÑÑÑ Ð¿Ð°Ñами, наделÑÑÑими иÑ
пеÑемеÑÑиÑелÑнÑм ÑвойÑÑвом (напÑимеÑ, date + integer и integer + date); здеÑÑ Ð¿ÑиводиÑÑÑ ÑолÑко один ваÑÐ¸Ð°Ð½Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ паÑÑ.
ТаблиÑа 9.32. ÐпеÑаÑоÑÑ Ð´Ð°ÑÑ/вÑемени
ÐпеÑаÑÐ¾Ñ ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐобавлÑÐµÑ Ðº даÑе заданное ÑиÑло дней
|
ÐобавлÑÐµÑ Ðº даÑе инÑеÑвал
|
ÐобавлÑÐµÑ Ðº даÑе вÑемÑ
|
СкладÑÐ²Ð°ÐµÑ Ð¸Ð½ÑеÑвалÑ
|
ÐобавлÑÐµÑ Ðº оÑмеÑке вÑемени инÑеÑвал
|
ÐобавлÑÐµÑ Ðº вÑемени инÑеÑвал
|
ÐенÑÐµÑ Ð½Ð°Ð¿Ñавление инÑеÑвала
|
ÐÑÑиÑÐ°ÐµÑ Ð´Ð°ÑÑ, вÑÐ´Ð°Ð²Ð°Ñ ÑазниÑÑ Ð² днÑÑ
|
ÐÑÑиÑÐ°ÐµÑ Ð¸Ð· даÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ ÑиÑло дней
|
ÐÑÑиÑÐ°ÐµÑ Ð¸Ð· даÑÑ Ð¸Ð½ÑеÑвал
|
ÐÑÑиÑÐ°ÐµÑ Ð¸Ð· одного вÑемени дÑÑгое
|
ÐÑÑиÑÐ°ÐµÑ Ð¸Ð· вÑемени инÑеÑвал
|
ÐÑÑиÑÐ°ÐµÑ Ð¸Ð· оÑмеÑки вÑемени инÑеÑвал
|
ÐÑÑиÑÐ°ÐµÑ Ð¸Ð· одного инÑеÑвала дÑÑгой
|
ÐÑÑиÑÐ°ÐµÑ Ð¸Ð· одной оÑмеÑки вÑемени дÑÑгÑÑ (пÑеобÑазÑÑ 24-ÑаÑовÑе инÑеÑÐ²Ð°Ð»Ñ Ð² дни подобно
|
Ð£Ð¼Ð½Ð¾Ð¶Ð°ÐµÑ Ð¸Ð½ÑеÑвал на ÑкалÑÑное знаÑение
|
ÐÐµÐ»Ð¸Ñ Ð¸Ð½ÑеÑвал на ÑкалÑÑное знаÑение
|
ТаблиÑа 9.33. ФÑнкÑии даÑÑ/вÑемени
ФÑнкÑÐ¸Ñ ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐÑÑиÑÐ°ÐµÑ Ð°ÑгÑменÑÑ Ð¸ вÑдаÑÑ Â«ÑимволиÑеÑкий» ÑезÑлÑÑÐ°Ñ Ñ Ð³Ð¾Ð´Ð°Ð¼Ð¸ и меÑÑÑами, а не пÑоÑÑо днÑми
|
ÐÑÑиÑÐ°ÐµÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð¸Ð·
|
ТекÑÑÐ°Ñ Ð´Ð°Ñа и вÑÐµÐ¼Ñ (менÑеÑÑÑ Ð² пÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов); Ñм. ÐодÑаздел 9.9.5
|
ТекÑÑÐ°Ñ Ð´Ð°Ñа; Ñм. ÐодÑаздел 9.9.5
|
ТекÑÑее вÑÐµÐ¼Ñ ÑÑÑок; Ñм. ÐодÑаздел 9.9.5
|
ТекÑÑее вÑÐµÐ¼Ñ ÑÑÑок (Ñ Ð¾Ð³ÑаниÑенной ÑоÑноÑÑÑÑ); Ñм. ÐодÑаздел 9.9.5
|
ТекÑÑÐ°Ñ Ð´Ð°Ñа и вÑÐµÐ¼Ñ (на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑÑанзакÑии); Ñм. ÐодÑаздел 9.9.5
|
ТекÑÑие даÑа и вÑÐµÐ¼Ñ (на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑÑанзакÑии; Ñ Ð¾Ð³ÑаниÑенной ÑоÑноÑÑÑÑ); Ñм. ÐодÑаздел 9.9.5
|
ÐобавлÑÐµÑ Ð·Ð½Ð°Ñение Ñипа
|
ÐодгонÑÐµÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ знаÑение под инÑеÑвал, оÑÑÑиÑÑÐ²Ð°Ñ Ð¾Ñ Ñказанного наÑалÑного моменÑа; Ñм. ÐодÑаздел 9.9.3
|
ÐозвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð»Ðµ даÑÑ/вÑемени (ÑавнознаÑно
|
ÐозвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð»Ðµ инÑеÑвала (ÑавнознаÑно
|
ÐÑÑиÑÐ°ÐµÑ Ð·Ð½Ð°Ñение Ñипа
|
ÐÑÑÐµÐºÐ°ÐµÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½ÑÑ Ð´Ð°ÑÑ Ð´Ð¾ заданной ÑоÑноÑÑи; Ñм. ÐодÑаздел 9.9.2
|
ÐÑÑÐµÐºÐ°ÐµÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½ÑÑ Ð´Ð°ÑÑ Ð´Ð¾ заданной ÑоÑноÑÑи в Ñказанном ÑаÑовом поÑÑе; Ñм. ÐодÑаздел 9.9.2
|
ÐÑÑÐµÐºÐ°ÐµÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½ÑÑ Ð´Ð°ÑÑ Ð´Ð¾ заданной ÑоÑноÑÑи; Ñм. ÐодÑаздел 9.9.2
|
ÐозвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð»Ðµ даÑÑ/вÑемени; Ñм. ÐодÑаздел 9.9.1
|
ÐозвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð»Ðµ инÑеÑвала; Ñм. ÐодÑаздел 9.9.1
|
ÐÑовеÑÑÐµÑ ÐºÐ¾Ð½ÐµÑноÑÑÑ Ð´Ð°ÑÑ (ÐµÑ Ð¾ÑлиÑие Ð¾Ñ +/-беÑконеÑноÑÑи)
|
ÐÑовеÑÑÐµÑ ÐºÐ¾Ð½ÐµÑноÑÑÑ Ð²Ñемени (его оÑлиÑие Ð¾Ñ +/-беÑконеÑноÑÑи)
|
ÐÑовеÑÑÐµÑ ÐºÐ¾Ð½ÐµÑноÑÑÑ Ð¸Ð½ÑеÑвала (в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð²Ñе инÑеÑÐ²Ð°Ð»Ñ ÐºÐ¾Ð½ÐµÑнÑ)
|
ÐÑеобÑазÑÐµÑ Ð¸Ð½ÑеÑвал Ñак, ÑÑо каждÑй 30-дневнÑй пеÑиод ÑÑиÑаеÑÑÑ Ð¾Ð´Ð½Ð¸Ð¼ меÑÑÑем
|
ÐÑеобÑазÑÐµÑ Ð¸Ð½ÑеÑвал Ñак, ÑÑо каждÑй 24-ÑаÑовой пеÑиод ÑÑиÑаеÑÑÑ Ð¾Ð´Ð½Ð¸Ð¼ днÑм
|
ÐÑеобÑазÑÐµÑ Ð¸Ð½ÑеÑвал Ñ Ð¿Ñименением
|
ТекÑÑее вÑÐµÐ¼Ñ ÑÑÑок; Ñм. ÐодÑаздел 9.9.5
|
ТекÑÑее вÑÐµÐ¼Ñ ÑÑÑок (Ñ Ð¾Ð³ÑаниÑенной ÑоÑноÑÑÑÑ); Ñм. ÐодÑаздел 9.9.5
|
ТекÑÑÐ°Ñ Ð´Ð°Ñа и вÑÐµÐ¼Ñ (на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑÑанзакÑии); Ñм. ÐодÑаздел 9.9.5
|
ТекÑÑие даÑа и вÑÐµÐ¼Ñ (на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑÑанзакÑии; Ñ Ð¾Ð³ÑаниÑенной ÑоÑноÑÑÑÑ); Ñм. ÐодÑаздел 9.9.5
|
ÐбÑазÑÐµÑ Ð´Ð°ÑÑ Ð¸Ð· полей: year (год), month (меÑÑÑ) и day (денÑ) (оÑÑиÑаÑелÑное знаÑение Ð¿Ð¾Ð»Ñ year ознаÑÐ°ÐµÑ Ð³Ð¾Ð´ до н. Ñ.)
|
ÐбÑазÑÐµÑ Ð¸Ð½ÑеÑвал из полей: years (годÑ), months (меÑÑÑÑ), weeks (недели), days (дни), hours (ÑаÑÑ), minutes (минÑÑÑ) и secs (ÑекÑндÑ), каждое из коÑоÑÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ ÑÑиÑаеÑÑÑ ÑавнÑм нÑлÑ.
|
ÐбÑазÑÐµÑ Ð²ÑÐµÐ¼Ñ Ð¸Ð· полей: hour (ÑаÑ), minute (минÑÑа) и sec (ÑекÑнда)
|
ÐбÑазÑÐµÑ Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени из полей: year (год), month (меÑÑÑ), day (денÑ), hour (ÑаÑ), minute (минÑÑа) и sec (ÑекÑнда) (оÑÑиÑаÑелÑное знаÑение Ð¿Ð¾Ð»Ñ year ознаÑÐ°ÐµÑ Ð³Ð¾Ð´ до н. Ñ.)
|
ÐбÑазÑÐµÑ Ð´Ð°ÑÑ Ð¸ вÑÐµÐ¼Ñ Ñ ÑаÑовÑм поÑÑом из полей: year (год), month (меÑÑÑ), day (денÑ), hour (ÑаÑ), minute (минÑÑа) и sec (ÑекÑнда) (оÑÑиÑаÑелÑное знаÑение Ð¿Ð¾Ð»Ñ year ознаÑÐ°ÐµÑ Ð³Ð¾Ð´ до н. Ñ.). ÐÑли паÑамеÑÑ
|
ТекÑÑÐ°Ñ Ð´Ð°Ñа и вÑÐµÐ¼Ñ (на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑÑанзакÑии); Ñм. ÐодÑаздел 9.9.5
|
ТекÑÑÐ°Ñ Ð´Ð°Ñа и вÑÐµÐ¼Ñ (на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑекÑÑего опеÑаÑоÑа); Ñм. ÐодÑаздел 9.9.5
|
ТекÑÑÐ°Ñ Ð´Ð°Ñа и вÑÐµÐ¼Ñ (как
|
ТекÑÑÐ°Ñ Ð´Ð°Ñа и вÑÐµÐ¼Ñ (на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑÑанзакÑии); Ñм. ÐодÑаздел 9.9.5
|
ÐÑеобÑазÑÐµÑ Ð²ÑÐµÐ¼Ñ ÑÐ¿Ð¾Ñ Ð¸ Unix (ÑиÑло ÑекÑнд Ñ 1970-01-01 00:00:00+00) в даÑÑ/вÑÐµÐ¼Ñ Ñ ÑаÑовÑм поÑÑом
|
Рдополнение к ÑÑим ÑÑнкÑиÑм поддеÑживаеÑÑÑ SQL-опеÑаÑÐ¾Ñ OVERLAPS:
(наÑало1,конеÑ1) OVERLAPS (наÑало2,конеÑ2) (наÑало1,длиÑелÑноÑÑÑ1) OVERLAPS (наÑало2,длиÑелÑноÑÑÑ2)
Ðго ÑезÑлÑÑаÑом бÑÐ´ÐµÑ true, когда два пеÑиода вÑемени (опÑеделÑннÑе Ñвоими гÑаниÑами) пеÑеÑекаÑÑÑÑ, и false в пÑоÑивном ÑлÑÑае. ÐÑаниÑÑ Ð¿ÐµÑиода можно задаÑÑ Ð»Ð¸Ð±Ð¾ в виде паÑÑ Ð´Ð°Ñ, вÑемени или Ð´Ð°Ñ Ñо вÑеменем, либо как даÑÑ, вÑÐµÐ¼Ñ (или даÑÑ Ñо вÑеменем) c инÑеÑвалом. Ðогда ÑказÑваеÑÑÑ Ð¿Ð°Ñа знаÑений, пеÑвÑм Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ наÑало, и ÐºÐ¾Ð½ÐµÑ Ð¿ÐµÑиода: OVERLAPS авÑомаÑиÑеÑки ÑÑиÑÐ°ÐµÑ Ð½Ð°Ñалом пеÑиода менÑÑее знаÑение. ÐеÑÐ¸Ð¾Ð´Ñ Ð²Ñемени ÑÑиÑаÑÑÑÑ Ð½Ð°Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ñ Ð¾ÑкÑÑÑÑми, Ñ. е. наÑало<=вÑемÑ<конеÑ, еÑли ÑолÑко наÑало и ÐºÐ¾Ð½ÐµÑ Ð½Ðµ ÑÐ°Ð²Ð½Ñ â в ÑÑом ÑлÑÑае пеÑиод пÑедÑÑавлÑÐµÑ Ð¾Ð´Ð¸Ð½ Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени. ÐÑо ознаÑаеÑ, напÑимеÑ, ÑÑо два пеÑиода, имеÑÑие ÑолÑко обÑÑÑ Ð³ÑаниÑÑ, не бÑдÑÑ ÑÑиÑаÑÑÑÑ Ð¿ÐµÑеÑекаÑÑимиÑÑ.
SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS
(DATE '2001-10-30', DATE '2002-10-30');
РезÑлÑÑаÑ:true
SELECT (DATE '2001-02-16', INTERVAL '100 days') OVERLAPS
(DATE '2001-10-30', DATE '2002-10-30');
РезÑлÑÑаÑ:false
SELECT (DATE '2001-10-29', DATE '2001-10-30') OVERLAPS
(DATE '2001-10-30', DATE '2001-10-31');
РезÑлÑÑаÑ:false
SELECT (DATE '2001-10-30', DATE '2001-10-30') OVERLAPS
(DATE '2001-10-30', DATE '2001-10-31');
РезÑлÑÑаÑ:trueÐÑи добавлении к меÑке Ñипа timestamp или timestamp with time zone знаÑÐµÐ½Ð¸Ñ interval (или пÑи вÑÑиÑании из него interval), Ð¿Ð¾Ð»Ñ Ð¼ÐµÑÑÑев, дней и микÑоÑекÑнд обÑабаÑÑваÑÑÑÑ Ð¿Ð¾ оÑеÑеди. СнаÑала даÑа в меÑке вÑемени изменÑеÑÑÑ Ð½Ð° Ñказанное колиÑеÑÑво меÑÑÑев, ÑоÑ
ÑанÑÑ Ð´ÐµÐ½Ñ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñм, еÑли он не пÑевÑÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво дней в новом меÑÑÑе, инаÑе бÑÐ´ÐµÑ Ð·Ð°Ð´Ð°Ð½ поÑледний Ð´ÐµÐ½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ меÑÑÑа. (ÐапÑимеÑ, 31 маÑÑа плÑÑ 1 меÑÑÑ ÑÑановиÑÑÑ 30 апÑелÑ, а 31 маÑÑа плÑÑ 2 меÑÑÑа â 31 маÑ.) ÐаÑем даÑа изменÑеÑÑÑ Ð½Ð° Ñказанное колиÑеÑÑво дней. Ðа обоиÑ
ÑÑиÑ
ÑÑапаÑ
меÑÑное вÑÐµÐ¼Ñ ÑÑÑок оÑÑаÑÑÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñм. ÐаконеÑ, еÑли Ñказано ненÑлевое знаÑение микÑоÑекÑнд, оно добавлÑеÑÑÑ Ð¸Ð»Ð¸ вÑÑиÑаеÑÑÑ Ð±ÑквалÑно. ÐÑи вÑполнении аÑиÑмеÑиÑеÑкиÑ
дейÑÑвий Ñо знаÑением Ñипа timestamp with time zone в ÑаÑовом поÑÑе Ñ Ð¿ÐµÑеÑ
одом на леÑнее вÑÐµÐ¼Ñ ÑÑо ознаÑаеÑ, ÑÑо добавление или вÑÑиÑание (напÑимеÑ) interval '1 day' не обÑзаÑелÑно пÑиведÑÑ Ðº ÑÐ¾Ð¼Ñ Ð¶Ðµ ÑезÑлÑÑаÑÑ, ÑÑо и добавление или вÑÑиÑание interval '24 hours'. ÐапÑимеÑ, в ÑаÑовом поÑÑе America/Denver:
SELECT timestamp with time zone '2005-04-02 12:00:00-07' + interval '1 day'; РезÑлÑÑаÑ:2005-04-03 12:00:00-06SELECT timestamp with time zone '2005-04-02 12:00:00-07' + interval '24 hours'; РезÑлÑÑаÑ:2005-04-03 13:00:00-06
ÐÑа ÑазниÑа обÑÑÑнÑеÑÑÑ Ñем, ÑÑо 2005-04-03 02:00 в ÑаÑовом поÑÑе America/Denver пÑоизоÑÑл пеÑеÑ
од на леÑнее вÑемÑ.
ÐбÑаÑиÑе внимание на возможнÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°ÑноÑÑÑ Ð² поле months в ÑезÑлÑÑаÑе ÑÑнкÑии age, вÑзваннÑÑ Ñем, ÑÑо ÑиÑло дней в ÑазнÑÑ
меÑÑÑаÑ
неодинаково. ÐÑÑиÑлÑÑ Ð¾ÑÑавÑиеÑÑ Ð´Ð½Ð¸ меÑÑÑа, Postgres Pro ÑаÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ Ð¼ÐµÑÑÑ Ð¼ÐµÐ½ÑÑей из двÑÑ
даÑ. ÐапÑимеÑ, ÑезÑлÑÑаÑом age('2004-06-01', '2004-04-30') бÑÐ´ÐµÑ 1 mon 1 day, Ñак как в апÑеле 30 дней, а Ñо же вÑÑажение Ñ Ð´Ð°Ñой 30 Ð¼Ð°Ñ Ð²ÑдаÑÑ 1 mon 2 days, Ñак как в мае 31 денÑ.
ÐÑÑиÑание Ð´Ð°Ñ Ð¸ Ð´Ð°Ñ Ñо вÑеменем Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑÑивиалÑной опеÑаÑией. Ðдин пÑинÑипиалÑно пÑоÑÑой ÑпоÑоб вÑполниÑÑ Ñакое вÑÑиÑление â пÑеобÑазоваÑÑ ÐºÐ°Ð¶Ð´Ð¾Ðµ знаÑение в колиÑеÑÑво ÑекÑнд, иÑполÑзÑÑ EXTRACT(EPOCH FROM ...), а заÑем найÑи ÑазниÑÑ ÑезÑлÑÑаÑов; пÑи ÑÑом бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑено ÑиÑло ÑекÑнд Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ Ð´Ð°Ñами. ÐÑи ÑÑом бÑÐ´ÐµÑ ÑÑÑено неодинаковое ÑиÑло дней в меÑÑÑаÑ
, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑаÑовÑÑ
поÑÑов и пеÑеÑ
Ð¾Ð´Ñ Ð½Ð° леÑнее вÑемÑ. ÐÑи вÑÑиÑании Ð´Ð°Ñ Ð¸Ð»Ð¸ Ð´Ð°Ñ Ñо вÑеменем Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа «-» вÑдаÑÑÑÑ ÑиÑло дней (по 24 ÑаÑа) и ÑаÑов/минÑÑ/ÑекÑнд Ð¼ÐµÐ¶Ð´Ñ Ð´Ð°Ð½Ð½Ñми знаÑениÑми, Ñ ÑÑÑÑом ÑеÑ
же ÑакÑоÑов. ФÑнкÑÐ¸Ñ age возвÑаÑÐ°ÐµÑ ÑиÑло леÑ, меÑÑÑев, дней и ÑаÑов/минÑÑ/ÑекÑнд, вÑполнÑÑ Ð²ÑÑиÑание по полÑм, а заÑем пеÑеÑÑиÑÑÐ²Ð°Ñ Ð¾ÑÑиÑаÑелÑнÑе знаÑениÑ. РазлиÑие ÑÑиÑ
подÑ
одов иллÑÑÑÑиÑÑÑÑ ÑледÑÑÑие запÑоÑÑ. ÐоказаннÑе ÑезÑлÑÑаÑÑ Ð±Ñли полÑÑÐµÐ½Ñ Ð´Ð»Ñ ÑаÑового поÑÑа 'US/Eastern'; Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñми даÑами пÑоизоÑÑл пеÑеÑ
од на леÑнее вÑемÑ:
SELECT EXTRACT(EPOCH FROM timestamptz '2013-07-01 12:00:00') -
EXTRACT(EPOCH FROM timestamptz '2013-03-01 12:00:00');
РезÑлÑÑаÑ:10537200.000000
SELECT (EXTRACT(EPOCH FROM timestamptz '2013-07-01 12:00:00') -
EXTRACT(EPOCH FROM timestamptz '2013-03-01 12:00:00'))
/ 60 / 60 / 24;
РезÑлÑÑаÑ:121.9583333333333333
SELECT timestamptz '2013-07-01 12:00:00' - timestamptz '2013-03-01 12:00:00';
РезÑлÑÑаÑ:121 days 23:00:00
SELECT age(timestamptz '2013-07-01 12:00:00', timestamptz '2013-03-01 12:00:00');
РезÑлÑÑаÑ:4 mons9.9.1. EXTRACT, date_part #
EXTRACT(полеFROMиÑÑоÑник)
ФÑнкÑÐ¸Ñ extract Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ Ð¿Ð¾Ð»Ñ, Ñакие как год или ÑаÑ, из знаÑений даÑÑ Ð¸ вÑемени. ÐÑÑоÑником должно бÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ вÑÑажением знаÑение Ñипа timestamp, date, time или interval. (ÐнаÑÐµÐ½Ð¸Ñ timestamp и time могÑÑ Ð±ÑÑÑ ÐºÐ°Ðº Ñ Ñказанием ÑаÑового поÑÑа, Ñак и без.) Ðоле â ÑÑо иденÑиÑикаÑÐ¾Ñ Ð¸Ð»Ð¸ ÑÑÑока, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾ÑоÑой вÑбиÑаеÑÑÑ Ð¿Ð¾Ð»Ðµ Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ Ð¸Ð· знаÑÐµÐ½Ð¸Ñ Ð¸ÑÑоÑника. ÐÐ»Ñ ÑазнÑÑ
Ñипов вÑ
однÑÑ
даннÑÑ
допÑÑÑÐ¸Ð¼Ñ ÑазнÑе полÑ: напÑимеÑ, Ð¿Ð¾Ð»Ñ Ð¼ÐµÐ½ÑÑе дней не могÑÑ Ð±ÑÑÑ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ñ Ð¸Ð· date, а Ð¿Ð¾Ð»Ñ Ð´Ð½ÐµÐ¹ и более не могÑÑ Ð±ÑÑÑ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ñ Ð¸Ð· time. ФÑнкÑÐ¸Ñ extract возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñипа numeric.
ÐопÑÑÑÐ¸Ð¼Ñ ÑледÑÑÑие имена полей:
centuryÐек; Ð´Ð»Ñ Ð·Ð½Ð°Ñений
intervalâ знаÑение Ð¿Ð¾Ð»Ñ Ð³Ð¾Ð´Ð°, ÑазделÑнное на ÑÑоSELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); РезÑлÑÑаÑ:
20SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:21SELECT EXTRACT(CENTURY FROM DATE '0001-01-01 AD'); РезÑлÑÑаÑ:1SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); РезÑлÑÑаÑ:-1SELECT EXTRACT(CENTURY FROM INTERVAL '2001 years'); РезÑлÑÑаÑ:20dayÐÐµÐ½Ñ Ð¼ÐµÑÑÑа (1â31); Ð´Ð»Ñ Ð·Ð½Ð°Ñений
intervalâ колиÑеÑÑво днейSELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
16SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute'); РезÑлÑÑаÑ:40decadeÐод, делÑннÑй на 10
SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
200dowÐÐµÐ½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸, ÑÑиÑÐ°Ñ Ñ Ð²Ð¾ÑкÑеÑенÑÑ (
0) до ÑÑббоÑÑ (6)SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
5ÐамеÑÑÑе, ÑÑо в
extractдни недели нÑмеÑÑÑÑÑÑ Ð½Ðµ Ñак, как в ÑÑнкÑииto_char(..., 'D').doyÐÐµÐ½Ñ Ð³Ð¾Ð´Ð° (1â365/366)
SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
47epochÐÐ»Ñ Ð·Ð½Ð°Ñений
timestamp with time zoneÑÑо ÑиÑло ÑекÑнд Ñ 1970-01-01 00:00:00 UTC (оÑÑиÑаÑелÑное Ð´Ð»Ñ Ð¿ÑедÑеÑÑвÑÑÑего вÑемени); Ð´Ð»Ñ Ð·Ð½Ð°Ñенийdateиtimestampâ номиналÑное ÑиÑло ÑекÑнд Ñ 1970-01-01 00:00:00 без ÑÑÑÑа ÑаÑового поÑÑа, пеÑÐµÑ Ð¾Ð´Ð¾Ð² на леÑнее вÑÐµÐ¼Ñ Ð¸ Ñ. п.; Ð´Ð»Ñ Ð·Ð½Ð°Ñенийintervalâ обÑее колиÑеÑÑво ÑекÑнд в инÑеÑвалеSELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08'); РезÑлÑÑаÑ:
982384720.120000SELECT EXTRACT(EPOCH FROM TIMESTAMP '2001-02-16 20:38:40.12'); РезÑлÑÑаÑ:982355920.120000SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); РезÑлÑÑаÑ:442800.000000ÐÑеобÑазоваÑÑ Ð²ÑÐµÐ¼Ñ ÑÐ¿Ð¾Ñ Ð¸ назад, в знаÑение
timestamp with time zone, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑto_timestampможно Ñак:SELECT to_timestamp(982384720.12); РезÑлÑÑаÑ:
2001-02-17 04:38:40.12+00ÐмейÑе в видÑ, ÑÑо пÑименÑÑ
to_timestampк вÑемени ÑÐ¿Ð¾Ñ Ð¸, извлеÑÑÐ½Ð½Ð¾Ð¼Ñ Ð¸Ð· знаÑениÑdateилиtimestamp, можно полÑÑиÑÑ Ð½Ðµ вполне ожидаемÑй ÑезÑлÑÑаÑ: ÑÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑ, ÑÑо изнаÑалÑное знаÑение задано в ÑаÑовом поÑÑе UTC, но ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ Ñак.hourÐоле ÑаÑов (0â23 в меÑÐºÐ°Ñ Ð²Ñемени, в инÑеÑÐ²Ð°Ð»Ð°Ñ â без огÑаниÑений)
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
20isodowÐÐµÐ½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸, ÑÑиÑÐ°Ñ Ñ Ð¿Ð¾Ð½ÐµÐ´ÐµÐ»Ñника (
1) до воÑкÑеÑенÑÑ (7)SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40'); РезÑлÑÑаÑ:
7РезÑлÑÑÐ°Ñ Ð¾ÑлиÑаеÑÑÑ Ð¾Ñ
dowÑолÑко Ð´Ð»Ñ Ð²Ð¾ÑкÑеÑенÑÑ. Ð¢Ð°ÐºÐ°Ñ Ð½ÑмеÑаÑÐ¸Ñ ÑооÑвеÑÑÑвÑÐµÑ ISO 8601.isoyearÐод Ñ Ð½ÑмеÑаÑией Ð½ÐµÐ´ÐµÐ»Ñ ÑоглаÑно ISO 8601, на коÑоÑÑй пÑÐ¸Ñ Ð¾Ð´Ð¸ÑÑÑ Ð´Ð°Ñа
SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01'); РезÑлÑÑаÑ:
2005SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); РезÑлÑÑаÑ:2006Ðод по неделÑÐ½Ð¾Ð¼Ñ ÐºÐ°Ð»ÐµÐ½Ð´Ð°ÑÑ ISO наÑинаеÑÑÑ Ñ Ð¿Ð¾Ð½ÐµÐ´ÐµÐ»Ñника недели, в коÑоÑой оказÑваеÑÑÑ 4 ÑнваÑÑ, Ñак ÑÑо в наÑале ÑнваÑÑ Ð¸Ð»Ð¸ в конÑе декабÑÑ Ð³Ð¾Ð´ по ISO Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð¾Ñ Ð³Ð¾Ð´Ð° по гÑигоÑианÑÐºÐ¾Ð¼Ñ ÐºÐ°Ð»ÐµÐ½Ð´Ð°ÑÑ. ÐодÑобнее об ÑÑом ÑаÑÑказÑваеÑÑÑ Ð² опиÑании полÑ
week.julianЮлианÑÐºÐ°Ñ Ð´Ð°Ñа, ÑооÑвеÑÑÑвÑÑÑÐ°Ñ Ð´Ð°Ñе или даÑе/вÑемени. ÐнаÑение бÑÐ´ÐµÑ Ð´ÑобнÑм, еÑли заданное вÑÐµÐ¼Ñ Ð¾ÑлиÑаеÑÑÑ Ð¾Ñ Ð½Ð°Ñала ÑÑÑок по меÑÑÐ½Ð¾Ð¼Ñ Ð²Ñемени. Ðа дополниÑелÑной инÑоÑмаÑией обÑаÑиÑеÑÑ Ðº РазделÑ B.7.
SELECT EXTRACT(JULIAN FROM DATE '2006-01-01'); РезÑлÑÑаÑ:
2453737SELECT EXTRACT(JULIAN FROM TIMESTAMP '2006-01-01 12:00'); РезÑлÑÑаÑ:2453737.50000000000000000000microsecondsÐнаÑение ÑекÑнд Ñ Ð´Ñобной ÑаÑÑÑÑ, Ñмноженное на 1 000 000; замеÑÑÑе, ÑÑо оно вклÑÑÐ°ÐµÑ Ð¸ ÑелÑе ÑекÑндÑ
SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5'); РезÑлÑÑаÑ:
28500000millenniumТÑÑÑÑелеÑие; Ð´Ð»Ñ Ð·Ð½Ð°Ñений
intervalâ знаÑение Ð¿Ð¾Ð»Ñ Ð³Ð¾Ð´Ð°, ÑазделÑнное на ÑÑÑÑÑÑSELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
3SELECT EXTRACT(MILLENNIUM FROM INTERVAL '2001 years'); РезÑлÑÑаÑ:2ÐÐ¾Ð´Ñ 20 века оÑноÑÑÑÑÑ ÐºÐ¾ вÑоÑÐ¾Ð¼Ñ ÑÑÑÑÑелеÑиÑ. ТÑеÑÑе ÑÑÑÑÑелеÑие наÑалоÑÑ 1 ÑнваÑÑ 2001 г.
millisecondsÐнаÑение ÑекÑнд Ñ Ð´Ñобной ÑаÑÑÑÑ, Ñмноженное на 1 000; замеÑÑÑе, ÑÑо оно вклÑÑÐ°ÐµÑ Ð¸ ÑелÑе ÑекÑндÑ.
SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5'); РезÑлÑÑаÑ:
28500.000minuteÐинÑÑÑ (0â59)
SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
38monthÐÐ¾Ð¼ÐµÑ Ð¼ÐµÑÑÑа в Ð³Ð¾Ð´Ñ (1â12), а длÑ
intervalâ оÑÑаÑок Ð¾Ñ Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÑиÑла меÑÑÑев на 12 (0â11)SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
2SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months'); РезÑлÑÑаÑ:3SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months'); РезÑлÑÑаÑ:1quarterÐваÑÑал (1â4), к коÑоÑÐ¾Ð¼Ñ Ð¾ÑноÑиÑÑÑ Ð´Ð°Ñа
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
1secondСекÑндÑ, вклÑÑÐ°Ñ Ð´ÑобнÑÑ ÑаÑÑÑ
SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
40.000000SELECT EXTRACT(SECOND FROM TIME '17:12:28.5'); РезÑлÑÑаÑ:28.500000timezoneСмеÑение ÑаÑового поÑÑа Ð¾Ñ UTC, пÑедÑÑавленное в ÑекÑÐ½Ð´Ð°Ñ . ÐоложиÑелÑнÑе знаÑÐµÐ½Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑ ÑаÑовÑм поÑÑам к воÑÑÐ¾ÐºÑ Ð¾Ñ UTC, а оÑÑиÑаÑелÑнÑе â к западÑ. (СÑÑого говоÑÑ, в Postgres Pro иÑполÑзÑеÑÑÑ Ð½Ðµ UTC, Ñак как ÑекÑÐ½Ð´Ñ ÐºÐ¾Ð¾ÑдинаÑии не ÑÑиÑÑваÑÑÑÑ.)
timezone_hourÐоле ÑаÑов в ÑмеÑении ÑаÑового поÑÑа
timezone_minuteÐоле минÑÑ Ð² ÑмеÑении ÑаÑового поÑÑа
weekÐÐ¾Ð¼ÐµÑ Ð½ÐµÐ´ÐµÐ»Ð¸ в Ð³Ð¾Ð´Ñ Ð¿Ð¾ неделÑÐ½Ð¾Ð¼Ñ ÐºÐ°Ð»ÐµÐ½Ð´Ð°ÑÑ ISO 8601. Ðо опÑеделениÑ, недели ISO 8601 наÑинаÑÑÑÑ Ñ Ð¿Ð¾Ð½ÐµÐ´ÐµÐ»Ñника, а пеÑÐ²Ð°Ñ Ð½ÐµÐ´ÐµÐ»Ñ Ð³Ð¾Ð´Ð° вклÑÑÐ°ÐµÑ 4 ÑнваÑÑ ÑÑого года. ÐÑÑгими Ñловами, пеÑвÑй ÑеÑвеÑг года вÑегда оказÑваеÑÑÑ Ð² 1 неделе ÑÑого года.
Ð ÑиÑÑеме нÑмеÑаÑии Ð½ÐµÐ´ÐµÐ»Ñ ISO пеÑвÑе ÑиÑла ÑнваÑÑ Ð¼Ð¾Ð³ÑÑ Ð¾ÑноÑиÑÑÑÑ Ðº 52-й или 53-й неделе пÑедÑдÑÑего года, а поÑледние ÑиÑла декабÑÑ â к пеÑвой неделе ÑледÑÑÑего года. ÐапÑимеÑ,
2005-01-01оÑноÑиÑÑÑ Ðº 53-й неделе 2004 г., а2006-01-01â к 52-й неделе 2005 г., Ñогда как2012-12-31вклÑÑаеÑÑÑ Ð² пеÑвÑÑ Ð½ÐµÐ´ÐµÐ»Ñ 2013 г. ÐоÑÑÐ¾Ð¼Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑоглаÑованнÑÑ ÑезÑлÑÑаÑов ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð¿Ð¾Ð»Ðµisoyearв паÑе Ñweek.SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
7yearÐоле года. УÑÑиÑе, ÑÑо года
0не бÑло, и ÑÑо ÑледÑÐµÑ Ð¸Ð¼ÐµÑÑ Ð² видÑ, вÑÑиÑÐ°Ñ Ð¸Ð· годов наÑей ÑÑÑ Ð³Ð¾Ð´Ñ Ð´Ð¾ наÑей ÑÑÑ.SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
2001
ÐÑи обÑабоÑке знаÑÐµÐ½Ð¸Ñ interval ÑÑнкÑÐ¸Ñ extract ÑоздаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹, ÑооÑвеÑÑÑвÑÑÑие инÑеÑпÑеÑаÑии, коÑоÑÐ°Ñ Ð¸ÑполÑзÑеÑÑÑ ÑÑнкÑией вÑвода инÑеÑвала. ÐÑи ÑÑом, еÑли наÑаÑÑ Ñ Ð½ÐµÐ½Ð¾Ñмализованного пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½ÑеÑвала, могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ñе ÑезÑлÑÑаÑÑ, напÑимеÑ:
SELECT INTERVAL '80 minutes'; РезÑлÑÑаÑ:01:20:00SELECT EXTRACT(MINUTES FROM INTERVAL '80 minutes'); РезÑлÑÑаÑ:20
ÐÑимеÑание
С аÑгÑменÑом +/-беÑконеÑноÑÑÑ extract возвÑаÑÐ°ÐµÑ +/-беÑконеÑноÑÑÑ Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¾Ñонно ÑвелиÑиваÑÑиÑ
ÑÑ Ð¿Ð¾Ð»ÐµÐ¹ (epoch, julian, year, isoyear, decade, century и millennium). ÐÐ»Ñ Ð´ÑÑгиÑ
полей возвÑаÑаеÑÑÑ NULL. Ðо веÑÑии 9.6 Postgres Pro возвÑаÑал Ð½Ð¾Ð»Ñ Ð´Ð»Ñ Ð²ÑеÑ
ÑлÑÑаев Ñ Ð±ÐµÑконеÑнÑми аÑгÑменÑами.
ФÑнкÑÐ¸Ñ extract в оÑновном пÑедназнаÑена Ð´Ð»Ñ Ð²ÑÑиÑлиÑелÑнÑÑ
Ñелей. ФÑнкÑии ÑоÑмаÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°ÑÑ/вÑемени опиÑÐ°Ð½Ñ Ð² Разделе 9.8.
ФÑнкÑÐ¸Ñ date_part ÑмÑлиÑÑÐµÑ ÑÑадиÑионнÑй Ð´Ð»Ñ Ingres ÑÐºÐ²Ð¸Ð²Ð°Ð»ÐµÐ½Ñ ÑÑандаÑÑной SQL-ÑÑнкÑии extract:
date_part('поле', иÑÑоÑник)
ÐамеÑÑÑе, ÑÑо здеÑÑ Ð¿Ð°ÑамеÑÑ Ð¿Ð¾Ð»Ðµ должен бÑÑÑ ÑÑÑоковÑм знаÑением, а не именем. ФÑнкÑÐ¸Ñ date_part воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ñе же полÑ, ÑÑо и extract. Ðо иÑÑоÑиÑеÑким пÑиÑинам ÑÑнкÑÐ¸Ñ date_part возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñипа double precision. РнекоÑоÑÑÑ
ÑлÑÑаÑÑ
ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к поÑеÑе ÑоÑноÑÑи. ÐоÑÑÐ¾Ð¼Ñ Ð²Ð¼ÐµÑÑо Ð½ÐµÑ ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ ÑÑнкÑÐ¸Ñ extract.
SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
РезÑлÑÑаÑ:16
SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
РезÑлÑÑаÑ:49.9.2. date_trunc #
ФÑнкÑÐ¸Ñ date_trunc ÑабоÑÐ°ÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ trunc Ð´Ð»Ñ ÑиÑел.
date_trunc(поле,знаÑение[,ÑаÑовой_поÑÑ])
ÐдеÑÑ Ð·Ð½Ð°Ñение â вÑÑажение Ñипа timestamp, timestamp with time zone или interval. (ÐнаÑÐµÐ½Ð¸Ñ Ñипов date и time авÑомаÑиÑеÑки пÑиводÑÑÑÑ Ðº Ñипам timestamp и interval, ÑооÑвеÑÑÑвенно.) ÐаÑамеÑÑ Ð¿Ð¾Ð»Ðµ опÑеделÑеÑ, до какой ÑоÑноÑÑи обÑезаÑÑ Ð¿ÐµÑеданное знаÑение. РвозвÑаÑаемом знаÑении, имеÑÑем Ñакже Ñип timestamp, timestamp with time zone или interval, вÑе полÑ, менее знаÑимÑе, Ñем заданное, бÑдÑÑ ÑÐ°Ð²Ð½Ñ Ð½ÑÐ»Ñ (или одномÑ, еÑли ÑÑо Ð½Ð¾Ð¼ÐµÑ Ð´Ð½Ñ Ð¸Ð»Ð¸ меÑÑÑа).
ÐаÑамеÑÑ Ð¿Ð¾Ð»Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ ÑледÑÑÑие знаÑениÑ:
microseconds |
milliseconds |
second |
minute |
hour |
day |
week |
month |
quarter |
year |
decade |
century |
millennium |
Ðогда вÑ
одное знаÑение Ð¸Ð¼ÐµÐµÑ Ñип timestamp with time zone, оно обÑезаеÑÑÑ Ñ ÑÑÑÑом заданного ÑаÑового поÑÑа; напÑимеÑ, еÑли обÑезаÑÑ Ð·Ð½Ð°Ñение до Ð¿Ð¾Ð»Ñ day (денÑ), в ÑезÑлÑÑаÑе бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑена полноÑÑ Ð² ÑÑом ÑаÑовом поÑÑе. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð²Ñ
одное знаÑение обÑезаеÑÑÑ Ñ ÑÑÑÑом паÑамеÑÑа TimeZone, но дополниÑелÑнÑй аÑгÑÐ¼ÐµÐ½Ñ ÑаÑовой_поÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð²ÑбÑаÑÑ Ð¸ дÑÑгой поÑÑ. Ðазвание ÑаÑового поÑÑа Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð»ÑбÑм из ÑпоÑобов, опиÑаннÑÑ
в ÐодÑазделе 8.5.3.
ЧаÑовой поÑÑ Ð½ÐµÐ»ÑÐ·Ñ Ð·Ð°Ð´Ð°ÑÑ Ð´Ð»Ñ Ð·Ð½Ð°Ñений Ñипа timestamp without time zone или interval. Такие знаÑÐµÐ½Ð¸Ñ Ð²Ñегда воÑпÑинимаÑÑÑÑ ÐºÐ°Ðº еÑÑÑ.
ÐеÑколÑко пÑимеÑов (вÑбÑан ÑаÑовой поÑÑ America/New_York):
SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
РезÑлÑÑаÑ: 2001-02-16 20:00:00
SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
РезÑлÑÑаÑ: 2001-01-01 00:00:00
SELECT date_trunc('day', TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40+00');
РезÑлÑÑаÑ: 2001-02-16 00:00:00-05
SELECT date_trunc('day', TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40+00', 'Australia/Sydney');
РезÑлÑÑаÑ: 2001-02-16 08:00:00-05
SELECT date_trunc('hour', INTERVAL '3 days 02:47:33');
РезÑлÑÑаÑ: 3 days 02:00:00
9.9.3. date_bin #
ФÑнкÑÐ¸Ñ date_bin «подгонÑеÑ» заданное знаÑение под инÑеÑвал (Ñаг), оÑÑÑиÑÑÐ²Ð°Ñ Ð¾Ñ Ñказанного наÑалÑного моменÑа.
date_bin(Ñаг,знаÑение,иÑÑоÑник)
ÐдеÑÑ Ð·Ð½Ð°Ñение â вÑÑажение Ñипа timestamp, timestamp with time zone. (ÐнаÑÐµÐ½Ð¸Ñ Ñипов date авÑомаÑиÑеÑки пÑиводÑÑÑÑ Ðº ÑÐ¸Ð¿Ñ timestamp.) РкаÑеÑÑве Ñага пеÑедаÑÑÑÑ Ð²ÑÑажение Ñипа interval. РезÑлÑÑÐ°Ñ ÑÑой ÑÑнкÑии, Ñакже имеÑÑий Ñип timestamp, timestamp with time zone или interval, â наÑало инÑеÑвала, под коÑоÑÑй подгонÑеÑÑÑ Ð·Ð½Ð°Ñение.
ÐÑимеÑÑ:
SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-01-01');
РезÑлÑÑаÑ: 2020-02-11 15:30:00
SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-01-01 00:02:30');
РезÑлÑÑаÑ: 2020-02-11 15:32:30
Ð ÑлÑÑае ÑелÑÑ
ÐµÐ´Ð¸Ð½Ð¸Ñ Ð¸Ð·Ð¼ÐµÑÐµÐ½Ð¸Ñ (1 минÑÑа, 1 ÑÐ°Ñ Ð¸ Ñ. д.), она даÑÑ ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑаÑ, ÑÑо и аналогиÑнÑй вÑзов ÑÑнкÑии date_trunc, Ñ Ñой лиÑÑ ÑазниÑей, ÑÑо date_bin Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÑÑглиÑÑ Ð´Ð°ÑÑ Ð´Ð¾ пÑоизволÑного инÑеÑвала.
ÐаÑамеÑÑ Ñаг инÑеÑвала должен бÑÑÑ Ð±Ð¾Ð»ÑÑе нÑÐ»Ñ Ð¸ задаваÑÑÑÑ Ð² единиÑаÑ
измеÑÐµÐ½Ð¸Ñ Ð¼ÐµÐ½ÑÑе меÑÑÑа.
9.9.4. AT TIME ZONE #
ÐпеÑаÑÐ¾Ñ AT TIME ZONE пÑеобÑазÑÐµÑ Ð´Ð°ÑÑ/вÑÐµÐ¼Ñ Ð±ÐµÐ· ÑаÑового поÑÑа в даÑÑ/вÑÐµÐ¼Ñ Ñ ÑаÑовÑм поÑÑом и обÑаÑно, а Ñакже пеÑеÑÑиÑÑÐ²Ð°ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ time with time zone Ð´Ð»Ñ ÑазлиÑнÑÑ
ÑаÑовÑÑ
поÑÑов. Ðго ваÑиаÑии Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð² ТаблиÑе 9.34.
ТаблиÑа 9.34. РазновидноÑÑи AT TIME ZONE
ÐпеÑаÑÐ¾Ñ ÐпиÑание ÐÑимеÑ(Ñ) |
|---|
ÐеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð·Ð½Ð°Ñение даÑÑ/вÑемени без ÑаÑового поÑÑа в даÑÑ/вÑÐµÐ¼Ñ Ñ ÑаÑовÑм поÑÑом, в пÑедположении, ÑÑо Ð²Ñ Ð¾Ð´Ð½Ð¾Ðµ знаÑение задано в Ñказанном поÑÑе.
|
ÐеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð·Ð½Ð°Ñение даÑÑ/вÑемени Ñ ÑаÑовÑм поÑÑом в даÑÑ/вÑÐµÐ¼Ñ Ð±ÐµÐ· ÑаÑового поÑÑа, коÑоÑое ÑооÑвеÑÑÑвÑÐµÑ Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² Ñказанном поÑÑе.
|
ÐеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð·Ð½Ð°Ñение вÑемени Ñ ÑаÑовÑм поÑÑом в дÑÑгой ÑаÑовой поÑÑ. Так как вÑÐµÐ¼Ñ Ð·Ð°Ð´Ð°ÑÑÑÑ Ð±ÐµÐ· даÑÑ, в ÑаÑÑÑÑе иÑполÑзÑеÑÑÑ Ð´ÐµÐ¹ÑÑвÑÑÑее в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑмеÑение Ñказанного ÑаÑового поÑÑа Ð¾Ñ UTC.
|
Ð ÑÑиÑ
вÑÑажениÑÑ
желаемÑй ÑаÑовой_поÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ задаÑÑ Ð»Ð¸Ð±Ð¾ в виде ÑекÑÑовой ÑÑÑоки (напÑимеÑ, 'America/Los_Angeles'), либо как инÑеÑвал (напÑимеÑ, INTERVAL '-08:00'). РпеÑвом ÑлÑÑае название ÑаÑового поÑÑа можно ÑказаÑÑ Ð»ÑбÑм из ÑпоÑобов, опиÑаннÑÑ
в ÐодÑазделе 8.5.3. ÐаÑÐ¸Ð°Ð½Ñ Ñ Ð¸Ð½ÑеÑвалом полезен, ÑолÑко еÑли Ð´Ð»Ñ ÑаÑового поÑÑа ÑмеÑение Ð¾Ñ UTC вÑегда поÑÑоÑнно, ÑÑо на пÑакÑике вÑÑÑеÑаеÑÑÑ Ð½ÐµÑаÑÑо.
ÐÑимеÑÑ (паÑамеÑÑ TimeZone Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение America/Los_Angeles):
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'America/Denver'; РезÑлÑÑаÑ:2001-02-16 19:38:40-08SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'America/Denver'; РезÑлÑÑаÑ:2001-02-16 18:38:40SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'Asia/Tokyo' AT TIME ZONE 'America/Chicago'; РезÑлÑÑаÑ:2001-02-16 05:38:40
РпеÑвом пÑимеÑе Ð´Ð»Ñ Ð·Ð½Ð°ÑениÑ, заданного без ÑаÑового поÑÑа, ÑказÑваеÑÑÑ ÑаÑовой поÑÑ Ð¸ полÑÑенное вÑÐµÐ¼Ñ Ð²ÑводиÑÑÑ Ð² ÑекÑÑем ÑаÑовом поÑÑе (заданном паÑамеÑÑом TimeZone). Ðо вÑоÑом пÑимеÑе знаÑение вÑемени ÑмеÑаеÑÑÑ Ð² заданнÑй ÑаÑовой поÑÑ Ð¸ вÑдаÑÑÑÑ Ð±ÐµÐ· ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÑаÑового поÑÑа. ÐÑо позволÑÐµÑ Ñ
ÑаниÑÑ Ð¸ вÑводиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñ ÑаÑовÑм поÑÑом, оÑлиÑнÑм Ð¾Ñ ÑекÑÑего. Ð ÑÑеÑÑем пÑимеÑе вÑÐµÐ¼Ñ Ð² ÑаÑовом поÑÑе Токио пÑеобÑазÑеÑÑÑ Ð´Ð»Ñ ÑаÑового поÑÑа Чикаго.
ФÑнкÑÐ¸Ñ ÑавнознаÑна SQL-ÑовмеÑÑимой конÑÑÑÑкÑии timezone(ÑаÑовой_поÑÑ, вÑемÑ).вÑÐµÐ¼Ñ AT TIME ZONE ÑаÑовой_поÑÑ
9.9.5. ТекÑÑÐ°Ñ Ð´Ð°Ñа/вÑÐµÐ¼Ñ #
Postgres Pro пÑедоÑÑавлÑÐµÑ Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий, ÑезÑлÑÑÐ°Ñ ÐºÐ¾ÑоÑÑÑ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¾Ñ ÑекÑÑей даÑÑ Ð¸ вÑемени. ÐÑе ÑледÑÑÑие ÑÑнкÑии ÑооÑвеÑÑÑвÑÑÑ ÑÑандаÑÑÑ SQL и возвÑаÑаÑÑ Ð·Ð½Ð°ÑениÑ, оÑÑажаÑÑие вÑÐµÐ¼Ñ Ð½Ð°Ñала ÑекÑÑей ÑÑанзакÑии:
CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_TIME(ÑоÑноÑÑÑ) CURRENT_TIMESTAMP(ÑоÑноÑÑÑ) LOCALTIME LOCALTIMESTAMP LOCALTIME(ÑоÑноÑÑÑ) LOCALTIMESTAMP(ÑоÑноÑÑÑ)
CURRENT_TIME и CURRENT_TIMESTAMP возвÑаÑаÑÑ Ð²ÑÐµÐ¼Ñ Ñ ÑаÑовÑм поÑÑом. Ð ÑезÑлÑÑаÑаÑ
LOCALTIME и LOCALTIMESTAMP Ð½ÐµÑ Ð¸Ð½ÑоÑмаÑии о ÑаÑовом поÑÑе.
CURRENT_TIME, CURRENT_TIMESTAMP, LOCALTIME и LOCALTIMESTAMP могÑÑ Ð¿ÑинимаÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑй паÑамеÑÑ ÑоÑноÑÑи, опÑеделÑÑÑий, до какого знака поÑле запÑÑой ÑледÑÐµÑ Ð¾ÐºÑÑглÑÑÑ Ð¿Ð¾Ð»Ðµ ÑекÑнд. ÐÑли ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¾ÑÑÑÑÑÑвÑеÑ, ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð¼Ð°ÐºÑималÑно возможнÑÑ ÑоÑноÑÑÑ.
ÐеÑколÑко пÑимеÑов:
SELECT CURRENT_TIME; РезÑлÑÑаÑ:14:39:53.662522-05SELECT CURRENT_DATE; РезÑлÑÑаÑ:2019-12-23SELECT CURRENT_TIMESTAMP; РезÑлÑÑаÑ:2019-12-23 14:39:53.662522-05SELECT CURRENT_TIMESTAMP(2); РезÑлÑÑаÑ:2019-12-23 14:39:53.66-05SELECT LOCALTIMESTAMP; РезÑлÑÑаÑ:2019-12-23 14:39:53.662522
Так как ÑÑи ÑÑнкÑии возвÑаÑаÑÑ Ð²ÑÐµÐ¼Ñ Ð½Ð°Ñала ÑекÑÑей ÑÑанзакÑии, во вÑÐµÐ¼Ñ ÑÑанзакÑии ÑÑи знаÑÐµÐ½Ð¸Ñ Ð½Ðµ менÑÑÑÑÑ. ÐÑо ÑÑиÑаеÑÑÑ Ð½Ðµ оÑибкой, а оÑобенноÑÑÑÑ ÑеализаÑии: ÑÐµÐ»Ñ Ñакого Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² Ñом, ÑÑÐ¾Ð±Ñ Ð² одной ÑÑанзакÑии «ÑекÑÑее» вÑÐµÐ¼Ñ Ð±Ñло одинаковÑм и Ð´Ð»Ñ ÑазнÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в одной ÑÑанзакÑий запиÑÑвалаÑÑ Ð¾Ð´Ð½Ð° оÑмеÑка вÑемени.
ÐÑимеÑание
РдÑÑÐ³Ð¸Ñ Ð¡Ð£ÐÐ ÑÑи знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÑÑ ÑаÑе.
Ð Postgres Pro еÑÑÑ Ñакже ÑÑнкÑии, возвÑаÑаÑÑие вÑÐµÐ¼Ñ Ð½Ð°Ñала ÑекÑÑего опеÑаÑоÑа, а Ñакже ÑекÑÑее вÑÐµÐ¼Ñ Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñзова ÑÑнкÑии. Таким обÑазом, в Postgres Pro еÑÑÑ ÑледÑÑÑие ÑÑнкÑии, не опиÑаннÑе в ÑÑандаÑÑе SQL:
transaction_timestamp() statement_timestamp() clock_timestamp() timeofday() now()
ФÑнкÑÐ¸Ñ transaction_timestamp() ÑавнознаÑна конÑÑÑÑкÑии CURRENT_TIMESTAMP, но в ÐµÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ð¸ Ñвно оÑÑажено, ÑÑо она возвÑаÑаеÑ. ФÑнкÑÐ¸Ñ statement_timestamp() возвÑаÑÐ°ÐµÑ Ð²ÑÐµÐ¼Ñ Ð½Ð°Ñала ÑекÑÑего опеÑаÑоÑа (более ÑоÑно, вÑÐµÐ¼Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ñледнего командного ÑообÑÐµÐ½Ð¸Ñ Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñа). ФÑнкÑии statement_timestamp() и transaction_timestamp() возвÑаÑаÑÑ Ð¾Ð´Ð½Ð¾ и Ñо же знаÑение в пеÑвом опеÑаÑоÑе ÑÑанзакÑии, но в поÑледÑÑÑиÑ
опеÑаÑоÑаÑ
иÑ
Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð±ÑдÑÑ ÑаÑÑ
одиÑÑÑÑ. ФÑнкÑÐ¸Ñ clock_timestamp() возвÑаÑÐ°ÐµÑ ÑакÑиÑеÑкое ÑекÑÑее вÑемÑ, Ñак ÑÑо ÐµÑ Ð·Ð½Ð°Ñение менÑеÑÑÑ Ð² ÑамкаÑ
одного опеÑаÑоÑа SQL. ФÑнкÑÐ¸Ñ timeofday() ÑÑÑеÑÑвÑÐµÑ Ð² Postgres Pro по иÑÑоÑиÑеÑким пÑиÑинам и, подобно clock_timestamp(), она возвÑаÑÐ°ÐµÑ ÑакÑиÑеÑкое ÑекÑÑее вÑемÑ, но пÑедÑÑавленное в виде ÑоÑмаÑиÑованной ÑÑÑоки Ñипа text, а не знаÑÐµÐ½Ð¸Ñ timestamp with time zone. ФÑнкÑÐ¸Ñ now() â ÑÑадиÑионнÑй Ð´Ð»Ñ Postgres Pro ÑÐºÐ²Ð¸Ð²Ð°Ð»ÐµÐ½Ñ ÑÑнкÑии transaction_timestamp().
ÐÑе ÑÐ¸Ð¿Ñ Ð´Ð°ÑÑ/вÑемени Ñакже пÑинимаÑÑ ÑпеÑиалÑное бÑквалÑное знаÑение now, подÑазÑмеваÑÑее ÑекÑÑÑÑ Ð´Ð°ÑÑ Ð¸ вÑÐµÐ¼Ñ (Ñоже на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑÑанзакÑии). Таким обÑазом, ÑезÑлÑÑÐ°Ñ ÑледÑÑÑиÑ
ÑÑÑÑ
опеÑаÑоÑов бÑÐ´ÐµÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм:
SELECT CURRENT_TIMESTAMP; SELECT now(); SELECT TIMESTAMP 'now'; -- Ñм. замеÑание ниже
ÐодÑказка
Ðе иÑполÑзÑйÑе ÑÑеÑÑÑ ÑоÑÐ¼Ñ Ð´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð·Ð½Ð°ÑениÑ, коÑоÑое бÑÐ´ÐµÑ Ð²ÑÑиÑлÑÑÑÑÑ Ð¿Ð¾Ð·Ð´Ð½ÐµÐµ, напÑимеÑ, в пÑедложении DEFAULT Ð´Ð»Ñ ÑÑолбÑа ÑаблиÑÑ. СиÑÑема пÑеобÑазÑÐµÑ now в знаÑение timestamp в Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑазбоÑа конÑÑанÑÑ, поÑÑÐ¾Ð¼Ñ ÐºÐ¾Ð³Ð´Ð° бÑÐ´ÐµÑ Ð²ÑÑавлÑÑÑÑÑ Ñакое знаÑение по ÑмолÑаниÑ, в ÑооÑвеÑÑÑвÑÑÑем ÑÑолбÑе окажеÑÑÑ Ð²ÑÐµÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑаблиÑÑ! ÐеÑвÑе две ÑоÑÐ¼Ñ Ð±ÑдÑÑ Ð²ÑÑиÑлÑÑÑÑÑ, ÑолÑко когда знаÑение по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾ÑÑебÑеÑÑÑ, Ñак как ÑÑо вÑÐ·Ð¾Ð²Ñ ÑÑнкÑии. ÐоÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¸ дадÑÑ Ð¶ÐµÐ»Ð°ÐµÐ¼Ñй ÑезÑлÑÑÐ°Ñ Ð¿Ñи добавлении ÑÑÑоки в ÑаблиÑÑ. (См. Ñакже ÐодÑаздел 8.5.1.4.)
9.9.6. ÐадеÑжка вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ #
Ð ÑлÑÑае Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи вÑполнение ÑеÑвеÑного пÑоÑеÑÑа можно пÑиоÑÑановиÑÑ, иÑполÑзÑÑ ÑледÑÑÑие ÑÑнкÑии:
pg_sleep(double precision) pg_sleep_for(interval) pg_sleep_until(timestamp with time zone)
ФÑнкÑÐ¸Ñ pg_sleep пеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð¿ÑоÑеÑÑ ÑекÑÑего ÑеанÑа в ÑпÑÑее ÑоÑÑоÑние на Ñказанное ÑиÑло ÑекÑнд (ÑÑо ÑиÑло Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´ÑобнÑм). Рдополнение к ней Ð´Ð»Ñ ÑдобÑÑва Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ Ð´Ð²Ðµ ÑÑнкÑии: pg_sleep_for, пÑинимаÑÑÐ°Ñ Ð²ÑÐµÐ¼Ñ Ð·Ð°Ð´ÐµÑжки в Ñипе interval, и pg_sleep_until, позволÑÑÑÐ°Ñ Ð·Ð°Ð´Ð°ÑÑ Ð¾Ð¿ÑеделÑнное вÑÐµÐ¼Ñ Ð²ÑÑ
ода из ÑпÑÑего ÑоÑÑоÑниÑ. ÐапÑимеÑ:
SELECT pg_sleep(1.5);
SELECT pg_sleep_for('5 minutes');
SELECT pg_sleep_until('tomorrow 03:00');ÐÑимеÑание
ÐейÑÑвиÑелÑное ÑазÑеÑение инÑеÑвала задеÑжки завиÑÐ¸Ñ Ð¾Ñ Ð¿Ð»Ð°ÑÑоÑмÑ; обÑÑно ÑÑо 0.01. ФакÑиÑеÑÐºÐ°Ñ Ð´Ð»Ð¸ÑелÑноÑÑÑ Ð·Ð°Ð´ÐµÑжки не бÑÐ´ÐµÑ Ð¼ÐµÐ½ÑÑе Ñказанного вÑемени, но Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð¾Ð»ÑÑе, в завиÑимоÑÑи, напÑÐ¸Ð¼ÐµÑ Ð¾Ñ Ð½Ð°Ð³ÑÑзки на ÑеÑвеÑ. Ð ÑаÑÑноÑÑи, не гаÑанÑиÑÑеÑÑÑ, ÑÑо pg_sleep_until пÑоÑнÑÑÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ в Ñказанное вÑемÑ, но она ÑоÑно не пÑоÑнÑÑÑÑ ÑанÑÑе.
ÐÑедÑпÑеждение
ÐÑежде Ñем вÑзÑваÑÑ pg_sleep или ÐµÑ Ð²Ð°ÑиаÑии, ÑбедиÑеÑÑ Ð² Ñом, ÑÑо в ÑекÑÑем ÑеанÑе Ð½ÐµÑ Ð½ÐµÐ½ÑжнÑÑ
блокиÑовок. РпÑоÑивном ÑлÑÑае в ÑоÑÑоÑние Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÐµÑейÑи и дÑÑгие ÑеанÑÑ, Ñак ÑÑо ÑÑо оÑÑазиÑÑÑ Ð½Ð° ÑиÑÑеме в Ñелом.