9.9. ÐпеÑаÑоÑÑ Ð¸ ÑÑнкÑии даÑÑ/вÑемени
ÐÑе ÑÑÑеÑÑвÑÑÑие ÑÑнкÑии Ð´Ð»Ñ Ð¾Ð±ÑабоÑки даÑÑ/вÑемени пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 9.31, а подÑобнее они опиÑÐ°Ð½Ñ Ð² ÑледÑÑÑиÑ
подÑазделаÑ
. Ðоведение оÑновнÑÑ
аÑиÑмеÑиÑеÑкиÑ
опеÑаÑоÑов (+, * и Ñ. д.) опиÑано в ТаблиÑе 9.30. ФÑнкÑии ÑоÑмаÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑиÑ
Ñипов даннÑÑ
бÑли пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² Разделе 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.30. ÐпеÑаÑоÑÑ Ð´Ð°ÑÑ/вÑемени
| ÐпеÑаÑÐ¾Ñ | ÐÑÐ¸Ð¼ÐµÑ | РезÑлÑÑÐ°Ñ |
|---|---|---|
+ | date '2001-09-28' + integer '7' | date '2001-10-05' |
+ | date '2001-09-28' + interval '1 hour' | timestamp '2001-09-28 01:00:00' |
+ | date '2001-09-28' + time '03:00' | timestamp '2001-09-28 03:00:00' |
+ | interval '1 day' + interval '1 hour' | interval '1 day 01:00:00' |
+ | timestamp '2001-09-28 01:00' + interval '23 hours' | timestamp '2001-09-29 00:00:00' |
+ | time '01:00' + interval '3 hours' | time '04:00:00' |
- | - interval '23 hours' | interval '-23:00:00' |
- | date '2001-10-01' - date '2001-09-28' | integer '3' (днÑ) |
- | date '2001-10-01' - integer '7' | date '2001-09-24' |
- | date '2001-09-28' - interval '1 hour' | timestamp '2001-09-27 23:00:00' |
- | time '05:00' - time '03:00' | interval '02:00:00' |
- | time '05:00' - interval '2 hours' | time '03:00:00' |
- | timestamp '2001-09-28 23:00' - interval '23 hours' | timestamp '2001-09-28 00:00:00' |
- | interval '1 day' - interval '1 hour' | interval '1 day -01:00:00' |
- | timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' | interval '1 day 15:00:00' |
* | 900 * interval '1 second' | interval '00:15:00' |
* | 21 * interval '1 day' | interval '21 days' |
* | double precision '3.5' * interval '1 hour' | interval '03:30:00' |
/ | interval '1 hour' / double precision '1.5' | interval '00:40:00' |
ТаблиÑа 9.31. ФÑнкÑии даÑÑ/вÑемени
| ФÑнкÑÐ¸Ñ | Тип ÑезÑлÑÑаÑа | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ | РезÑлÑÑÐ°Ñ |
|---|---|---|---|---|
| interval | ÐÑÑиÑÐ°ÐµÑ Ð°ÑгÑменÑÑ Ð¸ вÑдаÑÑ Â«ÑимволиÑеÑкий» ÑезÑлÑÑÐ°Ñ Ñ Ð³Ð¾Ð´Ð°Ð¼Ð¸ и меÑÑÑами, а не пÑоÑÑо днÑми | age(timestamp '2001-04-10', timestamp '1957-06-13') | 43 years 9 mons 27 days (43 года 9 меÑÑÑев 27 дней) |
| interval | ÐÑÑиÑÐ°ÐµÑ Ð´Ð°ÑÑ/вÑÐµÐ¼Ñ Ð¸Ð· current_date (полноÑÑ ÑекÑÑего днÑ) | age(timestamp '1957-06-13') | 43 years 8 mons 3 days (43 года 8 меÑÑÑев 3 днÑ) |
| timestamp with time zone | ТекÑÑÐ°Ñ Ð´Ð°Ñа и вÑÐµÐ¼Ñ (менÑеÑÑÑ Ð² пÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов); Ñм. ÐодÑаздел 9.9.4 |  |  |
| date | ТекÑÑÐ°Ñ Ð´Ð°Ñа; Ñм. ÐодÑаздел 9.9.4 |  |  |
| time with time zone | ТекÑÑее вÑÐµÐ¼Ñ ÑÑÑок; Ñм. ÐодÑаздел 9.9.4 |  |  |
| timestamp with time zone | ТекÑÑÐ°Ñ Ð´Ð°Ñа и вÑÐµÐ¼Ñ (на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑÑанзакÑии); Ñм. ÐодÑаздел 9.9.4 |  |  |
| double precision | ÐозвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð»Ðµ даÑÑ (ÑавнознаÑно extract); Ñм. ÐодÑаздел 9.9.1 | date_part('hour', timestamp '2001-02-16 20:38:40') | 20 |
| double precision | ÐозвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð»Ðµ даÑÑ (ÑавнознаÑно extract); Ñм. ÐодÑаздел 9.9.1 | date_part('month', interval '2 years 3 months') | 3 |
| timestamp | ÐÑÑÐµÐºÐ°ÐµÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½ÑÑ Ð´Ð°ÑÑ Ð´Ð¾ заданной ÑоÑноÑÑи; Ñм. ÐодÑаздел 9.9.2 | date_trunc('hour', timestamp '2001-02-16 20:38:40') | 2001-02-16 20:00:00 |
| timestamp with time zone | ÐÑÑÐµÐºÐ°ÐµÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½ÑÑ Ð´Ð°ÑÑ Ð´Ð¾ заданной ÑоÑноÑÑи в Ñказанном ÑаÑовом поÑÑе; Ñм. ÐодÑаздел 9.9.2 | date_trunc('day', timestamptz '2001-02-16 20:38:40+00', 'Australia/Sydney') | 2001-02-16 13:00:00+00 |
| interval | ÐÑÑÐµÐºÐ°ÐµÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½ÑÑ Ð´Ð°ÑÑ Ð´Ð¾ заданной ÑоÑноÑÑи; Ñм. ÐодÑаздел 9.9.2 | date_trunc('hour', interval '2 days 3 hours 40 minutes') | 2 days 03:00:00 |
| double precision | ÐозвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð»Ðµ даÑÑ; Ñм. ÐодÑаздел 9.9.1 | extract(hour from timestamp '2001-02-16 20:38:40') | 20 |
| double precision | ÐозвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð»Ðµ даÑÑ; Ñм. ÐодÑаздел 9.9.1 | extract(month from interval '2 years 3 months') | 3 |
| boolean | ÐÑовеÑÑÐµÑ ÐºÐ¾Ð½ÐµÑноÑÑÑ Ð´Ð°ÑÑ (ÐµÑ Ð¾ÑлиÑие Ð¾Ñ +/-беÑконеÑноÑÑи) | isfinite(date '2001-02-16') | true |
| boolean | ÐÑовеÑÑÐµÑ ÐºÐ¾Ð½ÐµÑноÑÑÑ Ð²Ñемени (его оÑлиÑие Ð¾Ñ +/-беÑконеÑноÑÑи) | isfinite(timestamp '2001-02-16 21:28:30') | true |
| boolean | ÐÑовеÑÑÐµÑ ÐºÐ¾Ð½ÐµÑноÑÑÑ Ð¸Ð½ÑеÑвала | isfinite(interval '4 hours') | true |
| interval | ÐÑеобÑазÑÐµÑ Ð¸Ð½ÑеÑвал Ñак, ÑÑо каждÑй 30-дневнÑй пеÑиод ÑÑиÑаеÑÑÑ Ð¾Ð´Ð½Ð¸Ð¼ меÑÑÑем | justify_days(interval '35 days') | 1 mon 5 days (1 меÑÑÑ 5 дней) |
| interval | ÐÑеобÑазÑÐµÑ Ð¸Ð½ÑеÑвал Ñак, ÑÑо каждÑй 24-ÑаÑовой пеÑиод ÑÑиÑаеÑÑÑ Ð¾Ð´Ð½Ð¸Ð¼ днÑм | justify_hours(interval '27 hours') | 1 day 03:00:00 (1 Ð´ÐµÐ½Ñ 03:00:00) |
| interval | ÐÑеобÑазÑÐµÑ Ð¸Ð½ÑеÑвал Ñ Ð¿Ñименением justify_days и justify_hours и дополниÑелÑно коÑÑекÑиÑÑÐµÑ Ð·Ð½Ð°ÐºÐ¸ | justify_interval(interval '1 mon -1 hour') | 29 days 23:00:00 (29 дней 23:00:00) |
| time | ТекÑÑее вÑÐµÐ¼Ñ ÑÑÑок; Ñм. ÐодÑаздел 9.9.4 |  |  |
| timestamp | ТекÑÑÐ°Ñ Ð´Ð°Ñа и вÑÐµÐ¼Ñ (на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑÑанзакÑии); Ñм. ÐодÑаздел 9.9.4 |  |  |
| date | ÐбÑазÑÐµÑ Ð´Ð°ÑÑ Ð¸Ð· полей: year (год), month (меÑÑÑ) и day (денÑ) | make_date(2013, 7, 15) | 2013-07-15 |
| interval | ÐбÑазÑÐµÑ Ð¸Ð½ÑеÑвал из полей: years (годÑ), months (меÑÑÑÑ), weeks (недели), days (дни), hours (ÑаÑÑ), minutes (минÑÑÑ) и secs (ÑекÑндÑ) | make_interval(days => 10) | 10 days |
| time | ÐбÑазÑÐµÑ Ð²ÑÐµÐ¼Ñ Ð¸Ð· полей: hour (ÑаÑ), minute (минÑÑа) и sec (ÑекÑнда) | make_time(8, 15, 23.5) | 08:15:23.5 |
| timestamp | ÐбÑазÑÐµÑ Ð´Ð°ÑÑ Ð¸ вÑÐµÐ¼Ñ Ð¸Ð· полей: year (год), month (меÑÑÑ), day (денÑ), hour (ÑаÑ), minute (минÑÑа) и sec (ÑекÑнда) | make_timestamp(2013, 7, 15, 8, 15, 23.5) | 2013-07-15 08:15:23.5 |
| timestamp with time zone | ÐбÑазÑÐµÑ Ð´Ð°ÑÑ Ð¸ вÑÐµÐ¼Ñ Ñ ÑаÑовÑм поÑÑом из полей: year (год), month (меÑÑÑ), day (денÑ), hour (ÑаÑ), minute (минÑÑа) и sec (ÑекÑнда). ÐÑли паÑамеÑÑ timezone (ÑаÑовой поÑÑ) не Ñказан, иÑполÑзÑеÑÑÑ ÑекÑÑий ÑаÑовой поÑÑ. | make_timestamptz(2013, 7, 15, 8, 15, 23.5) | 2013-07-15 08:15:23.5+01 |
| timestamp with time zone | ТекÑÑÐ°Ñ Ð´Ð°Ñа и вÑÐµÐ¼Ñ (на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑÑанзакÑии); Ñм. ÐодÑаздел 9.9.4 |  |  |
| timestamp with time zone | ТекÑÑÐ°Ñ Ð´Ð°Ñа и вÑÐµÐ¼Ñ (на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑекÑÑего опеÑаÑоÑа); Ñм. ÐодÑаздел 9.9.4 |  |  |
| text | ТекÑÑÐ°Ñ Ð´Ð°Ñа и вÑÐµÐ¼Ñ (как clock_timestamp, но в виде ÑÑÑоки Ñипа text); Ñм. ÐодÑаздел 9.9.4 |  |  |
| timestamp with time zone | ТекÑÑÐ°Ñ Ð´Ð°Ñа и вÑÐµÐ¼Ñ (на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала ÑÑанзакÑии); Ñм. ÐодÑаздел 9.9.4 |  |  |
| timestamp with time zone | ÐÑеобÑазÑÐµÑ Ð²ÑÐµÐ¼Ñ ÑÐ¿Ð¾Ñ Ð¸ Unix (ÑиÑло ÑекÑнд Ñ 1970-01-01 00:00:00+00) в ÑÑандаÑÑное вÑÐµÐ¼Ñ | to_timestamp(1284352323) | 2010-09-13 04:32:03+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 with time zone знаÑÐµÐ½Ð¸Ñ interval (или пÑи вÑÑиÑании из него interval), поле дней в ÑÑой даÑе ÑвелиÑиваеÑÑÑ (или ÑменÑÑаеÑÑÑ) на Ñказанное ÑиÑло ÑÑÑок, а вÑÐµÐ¼Ñ ÑÑÑок оÑÑаÑÑÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñм. ÐÑи пеÑеÑеÑении гÑаниÑÑ Ð¿ÐµÑеÑ
ода на леÑнее вÑÐµÐ¼Ñ (еÑли в ÑаÑовом поÑÑе ÑекÑÑего ÑеанÑа пÑоизводиÑÑÑ ÑÑÐ¾Ñ Ð¿ÐµÑеÑ
од) ÑÑо ознаÑаеÑ, ÑÑо 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
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.958333333333
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, time или interval. (ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñипа date пÑиводÑÑÑÑ Ðº ÑÐ¸Ð¿Ñ timestamp, Ñак ÑÑо допÑÑкаеÑÑÑ Ð¸ ÑÑÐ¾Ñ Ñип.) Указанное поле пÑедÑÑавлÑÐµÑ Ñобой иденÑиÑикаÑоÑ, по коÑоÑÐ¾Ð¼Ñ Ð¸Ð· иÑÑоÑника вÑбиÑаеÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ поле. ФÑнкÑÐ¸Ñ extract возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñипа double precision. ÐопÑÑÑимÑе полÑ:
centuryÐек:
SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); РезÑлÑÑаÑ:
20SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:21ÐеÑвÑй век наÑалÑÑ 0001-01-01 00:00:00, Ñ Ð¾ÑÑ Ð»Ñди в Ñо вÑÐµÐ¼Ñ Ð¸ не ÑÑиÑали Ñак. ÐÑо опÑеделение ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð½Ð° вÑе ÑÑÑÐ°Ð½Ñ Ñ Ð³ÑигоÑианÑким календаÑÑм. Ðека Ñ Ð½Ð¾Ð¼ÐµÑом 0 не бÑло; ÑÑиÑаеÑÑÑ, ÑÑо 1 наÑÑÑпил поÑле -1. ÐÑли Ñакое положение веÑей Ð²Ð°Ñ Ð½Ðµ ÑÑÑÑаиваеÑ, напÑавлÑйÑе Ð¶Ð°Ð»Ð¾Ð±Ñ Ð¿Ð¾ адÑеÑÑ: ÐаÑикан, Ð¡Ð¾Ð±Ð¾Ñ Ð¡Ð²ÑÑого ÐеÑÑа, Ðапе.
dayÐÐ»Ñ Ð·Ð½Ð°Ñений
timestampÑÑо Ð´ÐµÐ½Ñ Ð¼ÐµÑÑÑа (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.12SELECT EXTRACT(EPOCH FROM TIMESTAMP '2001-02-16 20:38:40.12'); РезÑлÑÑаÑ:982355920.12SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); РезÑлÑÑаÑ:442800ÐÑеобÑазоваÑÑ Ð²ÑÐµÐ¼Ñ ÑÐ¿Ð¾Ñ Ð¸ назад, в знаÑение
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.ÐÑого Ð¿Ð¾Ð»Ñ Ð½Ðµ бÑло в PostgreSQL до веÑÑии 8.3.
julianЮлианÑÐºÐ°Ñ Ð´Ð°Ñа, ÑооÑвеÑÑÑвÑÑÑÐ°Ñ Ð´Ð°Ñе или даÑе/вÑемени (Ð´Ð»Ñ Ð¸Ð½ÑеÑвала не опÑеделена). ÐнаÑение бÑÐ´ÐµÑ Ð´ÑобнÑм, еÑли заданное вÑÐµÐ¼Ñ Ð¾ÑлиÑаеÑÑÑ Ð¾Ñ Ð½Ð°Ñала ÑÑÑок по меÑÑÐ½Ð¾Ð¼Ñ Ð²Ñемени. Ðа дополниÑелÑной инÑоÑмаÑией обÑаÑиÑеÑÑ Ðº РазделÑ B.7.
SELECT EXTRACT(JULIAN FROM DATE '2006-01-01'); РезÑлÑÑаÑ:
2453737SELECT EXTRACT(JULIAN FROM TIMESTAMP '2006-01-01 12:00'); РезÑлÑÑаÑ:2453737.5microsecondsÐнаÑение ÑекÑнд Ñ Ð´Ñобной ÑаÑÑÑÑ, Ñмноженное на 1 000 000; замеÑÑÑе, ÑÑо оно вклÑÑÐ°ÐµÑ Ð¸ ÑелÑе ÑекÑндÑ
SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5'); РезÑлÑÑаÑ:
28500000millenniumТÑÑÑÑелеÑие
SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
3ÐÐ¾Ð´Ñ 20 века оÑноÑÑÑÑÑ ÐºÐ¾ вÑоÑÐ¾Ð¼Ñ ÑÑÑÑÑелеÑиÑ. ТÑеÑÑе ÑÑÑÑÑелеÑие наÑалоÑÑ 1 ÑнваÑÑ 2001 г.
millisecondsÐнаÑение ÑекÑнд Ñ Ð´Ñобной ÑаÑÑÑÑ, Ñмноженное на 1 000; замеÑÑÑе, ÑÑо оно вклÑÑÐ°ÐµÑ Ð¸ ÑелÑе ÑекÑндÑ.
SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5'); РезÑлÑÑаÑ:
28500minuteÐинÑÑÑ (0 - 59)
SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
38monthÐÐ»Ñ Ð·Ð½Ð°Ñений
timestampÑÑо Ð½Ð¾Ð¼ÐµÑ Ð¼ÐµÑÑÑа в Ð³Ð¾Ð´Ñ (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СекÑндÑ, вклÑÑÐ°Ñ Ð´ÑобнÑÑ ÑаÑÑÑ (0 - 59[7])
SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40'); РезÑлÑÑаÑ:
40SELECT EXTRACT(SECOND FROM TIME '17:12:28.5'); РезÑлÑÑаÑ:28.5timezoneСмеÑение ÑаÑового поÑÑа Ð¾Ñ 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
ÐÑимеÑание
С аÑгÑменÑом +/-беÑконеÑноÑÑÑ 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.
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. AT TIME ZONE
Указание AT TIME ZONE позволÑÐµÑ Ð¿ÐµÑеводиÑÑ Ð´Ð°ÑÑ/вÑÐµÐ¼Ñ Ð±ÐµÐ· ÑаÑового поÑÑа в даÑÑ/вÑÐµÐ¼Ñ Ñ ÑаÑовÑм поÑÑом и обÑаÑно, а Ñакже пеÑеÑÑиÑÑваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð²Ñемени Ð´Ð»Ñ ÑазлиÑнÑÑ
ÑаÑовÑÑ
поÑÑов. ÐÑе ÑазновидноÑÑи ÑÑого ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿ÑоиллÑÑÑÑиÑÐ¾Ð²Ð°Ð½Ñ Ð² ТаблиÑе 9.32.
ТаблиÑа 9.32. РазновидноÑÑи AT TIME ZONE
| ÐÑÑажение | Тип ÑезÑлÑÑаÑа | ÐпиÑание |
|---|---|---|
| timestamp with time zone | ÐоÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ вÑÐµÐ¼Ñ Ð±ÐµÐ· ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÑаÑового поÑÑа как вÑÐµÐ¼Ñ Ð² Ñказанном ÑаÑовом поÑÑе |
| timestamp without time zone | ÐеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ðµ знаÑение timestamp Ñ ÑаÑовÑм поÑÑом в дÑÑгой ÑаÑовой поÑÑ, но не ÑÐ¾Ñ ÑанÑÐµÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ нÑм в ÑезÑлÑÑаÑе |
| time with time zone | ÐеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ðµ вÑÐµÐ¼Ñ Ñ ÑаÑовÑм поÑÑом в дÑÑгой ÑаÑовой поÑÑ |
Ð ÑÑиÑ
вÑÑажениÑÑ
желаемÑй ÑаÑовой_поÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ задаÑÑ Ð»Ð¸Ð±Ð¾ в виде ÑекÑÑовой ÑÑÑоки (напÑимеÑ, 'America/Los_Angeles'), либо как инÑеÑвал (напÑимеÑ, INTERVAL '-08:00'). РпеÑвом ÑлÑÑае название ÑаÑового поÑÑа можно ÑказаÑÑ Ð»ÑбÑм из ÑпоÑобов, опиÑаннÑÑ
в ÐодÑазделе 8.5.3.
ÐÑимеÑÑ (в пÑедположении, ÑÑо меÑÑнÑй ÑаÑовой поÑÑ 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-05' AT TIME ZONE 'Asia/Tokyo' AT TIME ZONE 'America/Chicago'; РезÑлÑÑаÑ:2001-02-16 05:38:40
РпеÑвом пÑимеÑе Ð´Ð»Ñ Ð·Ð½Ð°ÑениÑ, заданного без ÑаÑового поÑÑа, ÑказÑваеÑÑÑ ÑаÑовой поÑÑ Ð¸ полÑÑенное вÑÐµÐ¼Ñ Ð²ÑводиÑÑÑ Ð² ÑекÑÑем ÑаÑовом поÑÑе (заданном паÑамеÑÑом TimeZone). Ðо вÑоÑом пÑимеÑе знаÑение вÑемени ÑмеÑаеÑÑÑ Ð² заданнÑй ÑаÑовой поÑÑ Ð¸ вÑдаÑÑÑÑ Ð±ÐµÐ· ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÑаÑового поÑÑа. ÐÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ñ
ÑаниÑÑ Ð¸ вÑводиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ñ ÑаÑовÑм поÑÑом, оÑлиÑнÑм Ð¾Ñ ÑекÑÑего. Ð ÑÑеÑÑем пÑимеÑе вÑÐµÐ¼Ñ Ð² ÑаÑовом поÑÑе Токио пеÑеÑÑиÑÑваеÑÑÑ Ð´Ð»Ñ ÑаÑового поÑÑа Чикаго. ÐÑи пеÑеводе знаÑений вÑемени без даÑÑ Ð² дÑÑгие ÑаÑовÑе поÑÑа иÑполÑзÑÑÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑаÑовÑÑ
поÑÑов, дейÑÑвÑÑÑие в даннÑй моменÑ.
ФÑнкÑÐ¸Ñ ÑавнознаÑна SQL-ÑовмеÑÑимой конÑÑÑÑкÑии timezone(ÑаÑовой_поÑÑ, вÑемÑ).вÑÐµÐ¼Ñ AT TIME ZONE ÑаÑовой_поÑÑ
9.9.4. ТекÑÑÐ°Ñ Ð´Ð°Ñа/вÑемÑ
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; РезÑлÑÑаÑ:2001-12-23SELECT CURRENT_TIMESTAMP; РезÑлÑÑаÑ:2001-12-23 14:39:53.662522-05SELECT CURRENT_TIMESTAMP(2); РезÑлÑÑаÑ:2001-12-23 14:39:53.66-05SELECT LOCALTIMESTAMP; РезÑлÑÑаÑ:2001-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.5. ÐадеÑжка вÑполнениÑ
Ð ÑлÑÑае Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑиоÑÑановиÑÑ Ð²Ñполнение ÑеÑвеÑного пÑоÑеÑÑа, иÑполÑзÑÑ ÑледÑÑÑие ÑÑнкÑии:
pg_sleep(Ñек) pg_sleep_for(interval) pg_sleep_until(timestamp with time zone)
ФÑнкÑÐ¸Ñ pg_sleep пеÑÐµÐ²Ð¾Ð´Ð¸Ñ Ð¿ÑоÑеÑÑ ÑекÑÑего ÑеанÑа в ÑпÑÑее ÑоÑÑоÑние на Ñказанное ÑиÑло ÑекÑнд (Ñек). ÐаÑамеÑÑ Ñек Ð¸Ð¼ÐµÐµÑ Ñип double precision, Ñак ÑÑо в нÑм можно ÑказаÑÑ Ð¸ дÑобное ÑиÑло. ФÑнкÑÐ¸Ñ 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 или ÐµÑ Ð²Ð°ÑиаÑии, ÑбедиÑеÑÑ Ð² Ñом, ÑÑо в ÑекÑÑем ÑеанÑе Ð½ÐµÑ Ð½ÐµÐ½ÑжнÑÑ
блокиÑовок. РпÑоÑивном ÑлÑÑае в ÑоÑÑоÑние Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÐµÑейÑи и дÑÑгие ÑеанÑÑ, Ñак ÑÑо ÑÑо оÑÑазиÑÑÑ Ð½Ð° ÑиÑÑеме в Ñелом.
[7] 60, еÑли опеÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ ÑиÑÑема поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑекÑÐ½Ð´Ñ ÐºÐ¾Ð¾ÑдинаÑии