DateTime UDF

В модуле DateTime основным внутренним форматом представления является Resourse<TM>, хранящий следующие компоненты даты:

  • Year (12 бит);
  • Month (4 бита);
  • Day (5 бит);
  • Hour (5 бит);
  • Minute (6 бит);
  • Second (6 бит);
  • Microsecond (20 бит);
  • TimezoneId (16 бит);
  • DayOfYear (9 бит) — день от начала года;
  • WeekOfYear (6 бит) — неделя от начала года, 1 января всегда относится к первой неделе;
  • DayOfWeek (3 бита) — день недели.

Если таймзона не GMT, то в компонентах хранится локальное время в соответствующей таймзоне.

Split

Преобразование из примитивного типа во внутреннее представление. Всегда успешно при непустом входе.

Список функций

  • DateTime::Split(Date{Flags:AutoMap}) -> Resource<TM>
  • DateTime::Split(Datetime{Flags:AutoMap}) -> Resource<TM>
  • DateTime::Split(Timestamp{Flags:AutoMap}) -> Resource<TM>
  • DateTime::Split(TzDate{Flags:AutoMap}) -> Resource<TM>
  • DateTime::Split(TzDatetime{Flags:AutoMap}) -> Resource<TM>
  • DateTime::Split(TzTimestamp{Flags:AutoMap}) -> Resource<TM>

Функции, принимающие на вход Resource<TM>, могут быть вызваны непосредственно от примитивного типа даты/времени. В этом случае будет сделано неявное преобразование через вызов соответствующей функции Split.

Make...

Сборка примитивного типа из внутреннего представления. Всегда успешна при непустом входе.

Список функций

  • DateTime::MakeDate(Resource<TM>{Flags:AutoMap}) -> Date
  • DateTime::MakeDatetime(Resource<TM>{Flags:AutoMap}) -> Datetime
  • DateTime::MakeTimestamp(Resource<TM>{Flags:AutoMap}) -> Timestamp
  • DateTime::MakeTzDate(Resource<TM>{Flags:AutoMap}) -> TzDate
  • DateTime::MakeTzDatetime(Resource<TM>{Flags:AutoMap}) -> TzDatetime
  • DateTime::MakeTzTimestamp(Resource<TM>{Flags:AutoMap}) -> TzTimestamp

Примеры

SELECT
    DateTime::MakeTimestamp(DateTime::Split(TzDatetime("2019-01-01T00:00:00,Europe/Moscow"))), -- 2018-12-31T21:00:00Z (конвертация в UTC)
    DateTime::MakeDate(TzDatetime("2019-01-01T12:00:00,GMT")); -- 2019-01-01 (Datetime -> Date с неявным Split)

Get...

Взятие компоненты внутреннего представления.

Список функций

  • DateTime::GetYear(Resource<TM>{Flags:AutoMap}) -> Uint16
  • DateTime::GetDayOfYear(Resource<TM>{Flags:AutoMap}) -> Uint16
  • DateTime::GetMonth(Resource<TM>{Flags:AutoMap}) -> Uint8
  • DateTime::GetMonthName(Resource<TM>{Flags:AutoMap}) -> String
  • DateTime::GetWeekOfYear(Resource<TM>{Flags:AutoMap}) -> Uint8
  • DateTime::GetDayOfMonth(Resource<TM>{Flags:AutoMap}) -> Uint8
  • DateTime::GetDayOfWeek(Resource<TM>{Flags:AutoMap}) -> Uint8
  • DateTime::GetDayOfWeekName(Resource<TM>{Flags:AutoMap}) -> String
  • DateTime::GetHour(Resource<TM>{Flags:AutoMap}) -> Uint8
  • DateTime::GetMinute(Resource<TM>{Flags:AutoMap}) -> Uint8
  • DateTime::GetSecond(Resource<TM>{Flags:AutoMap}) -> Uint8
  • DateTime::GetMillisecondOfSecond(Resource<TM>{Flags:AutoMap}) -> Uint32
  • DateTime::GetMicrosecondOfSecond(Resource<TM>{Flags:AutoMap}) -> Uint32
  • DateTime::GetTimezoneId(Resource<TM>{Flags:AutoMap}) -> Uint16
  • DateTime::GetTimezoneName(Resource<TM>{Flags:AutoMap}) -> String

Примеры

$tm = DateTime::Split(TzDatetime("2019-01-09T00:00:00,Europe/Moscow"));

SELECT
    DateTime::GetDayOfMonth($tm) as Day, -- 9
    DateTime::GetMonthName($tm) as Month, -- "January"
    DateTime::GetYear($tm) as Year, -- 2019
    DateTime::GetTimezoneId($tm) as TzId, -- 1
    DateTime::GetDayOfWeekName($tm) as WeekDay; -- "Wednesday"

Update

Обновление одной или нескольких компонент во внутреннем представлении. Возвращает либо обновлённую копию, либо NULL, если после обновления получается некорректная дата или возникают другие противоречия.

Список функций

  • DateTime::Update(Resource<TM>{Flags:AutoMap}, [Year:Uint16?, Month:Uint8?, Day:Uint8?, Hour:Uint8?, Minute:Uint8?, Second:Uint8?, Microsecond:Uint32?, TimezoneId:Uint16?]) -> Resource<TM>?

Примеры

$tm = DateTime::Split(Timestamp("2019-01-01T01:02:03.456789Z"));

SELECT
    DateTime::MakeDate(DateTime::Update($tm, 2012)), -- 2012-01-01
    DateTime::MakeDate(DateTime::Update($tm, 2000, 6, 6)), -- 2000-06-06
    DateTime::MakeDate(DateTime::Update($tm, NULL, 2, 30)), -- NULL (30 февраля)
    DateTime::MakeDatetime(DateTime::Update($tm, NULL, NULL, 31)), -- 2019-01-31T01:02:03Z
    DateTime::MakeDatetime(DateTime::Update($tm, 15 as Hour, 30 as Minute)), -- 2019-01-01T15:30:03Z
    DateTime::MakeTimestamp(DateTime::Update($tm, 999999 as Microsecond)), -- 2019-01-01T01:02:03.999999Z
    DateTime::MakeTimestamp(DateTime::Update($tm, 1 as TimezoneId)), -- 2018-12-31T22:02:03.456789Z (конвертация в UTC)
    DateTime::MakeTzTimestamp(DateTime::Update($tm, 1 as TimezoneId)); -- 2019-01-01T01:02:03.456789,Europe/Moscow

From... / To... / Interval...

Получение Timestamp из количества секунд/миллисекунд/микросекунд от начала эпохи.

Список функций

  • DateTime::FromSeconds(Uint32{Flags:AutoMap}) -> Timestamp
  • DateTime::FromMilliseconds(Uint64{Flags:AutoMap}) -> Timestamp
  • DateTime::FromMicroseconds(Uint64{Flags:AutoMap}) -> Timestamp

Получение количества секунд/миллисекунд/микросекунд от начала эпохи из примитивного типа.

Список функций

  • DateTime::ToSeconds(Date/DateTime/Timestamp/TzDate/TzDatetime/TzTimestamp{Flags:AutoMap}) -> Uint32
  • DateTime::ToMilliseconds(Date/DateTime/Timestamp/TzDate/TzDatetime/TzTimestamp{Flags:AutoMap}) -> Uint64
  • DateTime::ToMicroseconds(Date/DateTime/Timestamp/TzDate/TzDatetime/TzTimestamp{Flags:AutoMap}) -> Uint64

Примеры

SELECT
    DateTime::FromSeconds(1546304523), -- 2019-01-01T01:02:03.000000Z
    DateTime::ToMicroseconds(Datetime("2019-01-01T01:02:03.456789Z")); -- 1546304523456789

Преобразования между Interval и различными единицами измерения времени.

Список функций

  • DateTime::ToDays(Interval{Flags:AutoMap}) -> Int16
  • DateTime::ToHours(Interval{Flags:AutoMap}) -> Int32
  • DateTime::ToMinutes(Interval{Flags:AutoMap}) -> Int32
  • DateTime::ToSeconds(Interval{Flags:AutoMap}) -> Int32
  • DateTime::ToMilliseconds(Interval{Flags:AutoMap}) -> Int64
  • DateTime::ToMicroseconds(Interval{Flags:AutoMap}) -> Int64
  • DateTime::IntervalFromDays(Int16{Flags:AutoMap}) -> Interval
  • DateTime::IntervalFromHours(Int32{Flags:AutoMap}) -> Interval
  • DateTime::IntervalFromMinutes(Int32{Flags:AutoMap}) -> Interval
  • DateTime::IntervalFromSeconds(Int32{Flags:AutoMap}) -> Interval
  • DateTime::IntervalFromMilliseconds(Int64{Flags:AutoMap}) -> Interval
  • DateTime::IntervalFromMicroseconds(Int64{Flags:AutoMap}) -> Interval

Примеры

SELECT
    DateTime::ToDays(Interval("PT3000M")), -- 2
    DateTime::IntervalFromSeconds(1000000); -- 11 days 13 hours 46 minutes 40 seconds

Format

Получить строковое представление момента времени, используя произвольную строку форматирования.

Список функций

  • DateTime::Format(String) -> (Resource<TM>{Flags:AutoMap}) -> String

Для строки форматирования реализовано подмножество спецификаторов, аналогичных strptime.

  • %% - символ %;
  • %Y - год 4 цифры;
  • %m - месяц 2 цифры;
  • %d - день 2 цифры;
  • %H - час 2 цифры;
  • %M - минуты 2 цифры;
  • %S - секунды 2 цифры -- или xx.xxxxxx в случае непустых микросекунд;
  • %z - +hhmm or -hhmm;
  • %Z - IANA имя таймзоны.

Все остальные символы строки форматирования переносятся без изменений.

Примеры

$format = DateTime::Format("%Y-%m-%d %H:%M:%S %Z");

SELECT
    $format(DateTime::Split(TzDatetime("2019-01-01T01:02:03,Europe/Moscow"))); -- "2019-01-01 01:02:03 Europe/Moscow"

Parse

Распарсить строку во внутреннее представление, используя произвольную строку форматирования. Для незаполненных полей используются значения по умолчанию. При возникновении ошибок возвращается NULL.

Список функций

  • DateTime::Parse(String) -> (String{Flags:AutoMap}) -> Resource<TM>?

Реализованные спецификаторы:

  • %% - символ %;
  • %Y - год 4 цифры (1970);
  • %m - месяц 2 цифры (1);
  • %d - день 2 цифры (1);
  • %H - час 2 цифры (0);
  • %M - минуты 2 цифры (0);
  • %S - секунды (0), может принимать и микросекунды в форматах от xx. до xx.xxxxxx
  • %Z - IANA имя таймзоны (GMT).

Примеры

$parse1 = DateTime::Parse("%H:%M:%S");
$parse2 = DateTime::Parse("%S");
$parse3 = DateTime::Parse("%m/%d/%Y");
$parse4 = DateTime::Parse("%Z");

SELECT
    DateTime::MakeDatetime($parse1("01:02:03")), -- 1970-01-01T01:02:03Z
    DateTime::MakeTimestamp($parse2("12.3456")), -- 1970-01-01T00:00:12.345600Z
    DateTime::MakeTimestamp($parse3("02/30/2000")), -- NULL (Feb 30)
    DateTime::MakeTimestamp($parse4("Canada/Central")); -- 1970-01-01T06:00:00Z (конвертация в UTC)

Для распространённых форматов есть врапперы вокруг соответствующих методов util. Можно получить только TM с компонентами в UTC таймзоне.

Список функций

  • DateTime::ParseRfc822(String{Flags:AutoMap}) -> Resource<TM>?
  • DateTime::ParseIso8601(String{Flags:AutoMap}) -> Resource<TM>?
  • DateTime::ParseHttp(String{Flags:AutoMap}) -> Resource<TM>?
  • DateTime::ParseX509(String{Flags:AutoMap}) -> Resource<TM>?

Примеры

SELECT
    DateTime::MakeTimestamp(DateTime::ParseRfc822("Fri, 4 Mar 2005 19:34:45 EST")), -- 2005-03-05T00:34:45Z
    DateTime::MakeTimestamp(DateTime::ParseIso8601("2009-02-14T02:31:30+0300")), -- 2009-02-13T23:31:30Z
    DateTime::MakeTimestamp(DateTime::ParseHttp("Sunday, 06-Nov-94 08:49:37 GMT")), -- 1994-11-06T08:49:37Z
    DateTime::MakeTimestamp(DateTime::ParseX509("20091014165533Z")) -- 2009-10-14T16:55:33Z