Как получить текущую дату и время в PostgreSQL? 1 мин для чтения
Главное меню » Базы данных » PostgreSQL » Как получить текущую дату и время в PostgreSQL?
29 сентября 2021
В mySQL или PostgreSQL есть разные методы или функции для получения текущей даты и времени. В этой статье по статье будут рассмотрены все возможные функции и способы просмотра текущих даты и времени. Мы также увидим, как пользователь может изменить текущий регион, чтобы получить другую метку времени в этом руководстве. Итак, начнем с входа в систему из Windows 10.
Метод 01: функция Now()
Чтобы проверить текущую дату и время, первой функцией будет функция Now() PostgreSQL. Это самый простой и быстрый способ узнать текущую дату и время при использовании PostgreSQL. Начнем с открытия графического пользовательского интерфейса pgAdmin на панели задач рабочего стола Windows 10. После его открытия перейдите на панель задач pgAmdin и нажмите значок инструмента запроса, чтобы открыть его. После того, как инструмент запроса был открыт в pgAdmin, давайте напишем запрос, чтобы проверить текущую дату и время. Итак, для этого мы написали в нем приведенный ниже запрос функции Now(). Обязательно используйте предложение SELECT в своем запросе, чтобы он работал, как показано ниже. Щелкните треугольный значок «Выполнить», чтобы выполнить следующий запрос. Вывод, показанный на изображении, показывает текущую дату, время и отметку времени, например отметку зоны Пакистана в области вывода данных.
# SELECT NOW();
Если вы хотите проверить текущее время и дату другого региона, вам нужно сначала переключить свой регион на этот регион. Для изменения региона в PostgreSQL использовалась функция TIMEZONE. Мы должны использовать его с предложением SET, чтобы установить наш часовой пояс или изменить его на другой. Итак, мы установили для нашего часового пояса «Europe/Samara» в области запроса. После этого мы снова использовали функцию Now() с предложением SELECT, чтобы проверить текущую дату и время американского региона. Выполняйте команды, нажимая на значок «Выполнить» на панели задач. Выходные данные демонстрируют текущую дату и метку времени американского региона на снимке ниже.
SET TIMEZONE=’Europe/Samara’; SELECT NOW();
Читать Как узнать, кто блокирует таблицу в MySQL
Многие пользователи PostgreSQL не хотят видеть часовой пояс, а также текущую дату и время. Следовательно, у нас есть решение. Мы будем использовать простой запрос, чтобы игнорировать временные метки при поиске даты и времени. Мы должны использовать метку времени ключевого слова и функцию Now() в запросе, разделенные двойным двоеточием. Итак, мы попробовали следующий запрос в области запроса, чтобы сделать это. Вывод показывает дату и время без часового пояса.
SELECT NOW::timestamp;
Часто пользователь хочет проверить временную метку следующих часов подряд в PostgreSQL. Это также возможно с помощью простой функции Now() в запросе с использованием в нем некоторых ключевых слов. Итак, мы использовали нижеупомянутый запрос в оболочке, чтобы увидеть временную метку или время следующего 1 часа от текущего времени. Итак, мы использовали функцию Now() в скобках, добавив в нее 1-часовой интервал со знаком плюс. Это означает, что он получит текущее время и дату и добавит до 1 часа к текущему времени, чтобы получить метку времени следующего 1 часа с этого момента. Этот метод использовался в предложении SELECT, и результат был отображен с использованием имени столбца «hour_later» в области вывода. Выходной столбец «hour_later» показывает дату вместе со временем следующего часа с часовым поясом.
SELECT (NOW() + interval ‘1 hour’) AS hour_later;
Вышеупомянутый экземпляр собирался получить метку времени для следующего часа подряд. С другой стороны, пользователь также может проверить временную метку уже прошедшего времени. Например, пользователь может также проверить метку времени, указанную за 2 часа 30 минут назад. Итак, мы должны заменить «1 час» новым интервалом. Мы также изменили имя столбца в соответствии с требованиями. Основное изменение — использование здесь знака минус вместо знака плюса. Это нужно для того, чтобы вычесть последние 2 часа 30 минут из текущей метки времени и получить результаты. Выходные данные показывают дату и время для интервала, прошедшего 2 часа 30 минут назад.
SELECT NOW() - interval ‘2 hours 30 minutes’ AS two_h_30_m_ago;
Читать MySQL Pivot: поворот строк в столбцы
Если пользователь хочет проверить дату и время на следующий день подряд, он/она также может сделать это легко, и метод очень похож на приведенный выше пример. Вы должны заменить ключевое слово «1 hour» в запросе на «1 day». Остающийся запрос будет таким же. Вы также можете изменить имя столбца, которое будет отображаться на экране вывода. Итак, мы открыли еще одну вкладку инструмента запросов и выполнили запрос, указанный ниже. После успешной обработки этого запроса мы нашли дату и время следующего дня согласно выходным данным.
SELECT (NOW() + interval ‘1 day’) AS tomorrow_this_time;
Метод 02: CURRENT_TIME, CURRENT_DATE
Вместо использования функции Now() пользователь также может использовать другие функции для получения текущего времени и даты для выбранного региона. Мы использовали часовой пояс американского региона. Итак, по этому мы и получим результаты. На этот раз мы будем использовать различные предложения в запросе SELECT, чтобы получить дату и время для текущего региона. Во-первых, мы использовали предложения CURRENT_TIME и CURRENT_TIMESTAMP в запросе, чтобы получить текущее время и временную метку для американского региона. В обоих столбцах показаны разные стили вывода времени и даты с часовым поясом. Столбец «current_time» показывает только время с часовым поясом, а столбец «current_timestamp» показывает дату и время вместе с часовым поясом в другом формате.
SELECT CURRENT_TIME, CURRENT_TIMESTAMP;
Давайте изменим текущий часовой пояс на другой регион, например, Europe/Moscow, используя ключевое слово TIMEZONE с командой SET.
SET TIMEZONE=’Europe/Moscow’;
После изменения региона текущая дата, время и часовой пояс будут изменены в соответствии с ним. Вы можете увидеть результат для того же запроса, что и ниже.
SELECT CURRENT_TIME, CURRENT_TIMESTAMP;
Давайте посмотрим на использование ключевого слова CURRENT_DATE в запросе SELECT для проверки текущей даты в PostgreSQL. Итак, мы попробовали запрос ниже, чтобы получить время и дату для текущего региона, например, Азии. Вывод показывает дату и время с часовым поясом Азии.
SELECT CURRENT_DATE, CURRENT_TIME;
Читать Подготовка MySQL
Вы также можете получить дату и время в одном столбце вместо двух. Для этого вы должны использовать знак плюса в обоих предложениях, как показано ниже.
SELECT CURRENT_DATE + CURRENT_TIME;
Заключение:
Мы обсудили функции Now(), CURRENT_DATE и CURRENT_TIME, чтобы получить текущую дату и время, относящиеся к часовому поясу. Мы видели, как эти функции работают с отметкой часового пояса или без нее. Эти запросы одинаково функциональны в командной строке.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Как получить начало и конец текущего дня в t-sql?
Отрабатывает запрос некорректно. Подскажите, в чем может быть проблема?
Отслеживать
задан 4 фев 2022 в 21:30
Ivan Vlasov Ivan Vlasov
15 4 4 бронзовых знака
Есть такая штука — часовые пояса называется.
4 фев 2022 в 21:34
4 фев 2022 в 21:38
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
select cast(floor(cast( GETDATE() as float)) as datetime) valid_from,
DATEADD(SECOND, -1, cast(floor(cast( GETDATE() as float)) + 1 as datetime))
Отслеживать
ответ дан 4 фев 2022 в 22:02
28 4 4 бронзовых знака
- sql
- sql-server
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
SQL-Ex blog

Функции даты в SQL Server, Oracle и PostgreSQL
Добавил Sergey Moiseenko on Суббота, 19 марта. 2022
Функции даты весьма полезны для выполнения различных операций с датами, используемых как для фильтрации, так и форматирования дат в запросах. К сожалению, имеются различия в реализации этих функций в SQL Server, Oracle и PostgreSQL, которым и посвящена эта статья.
В этом руководстве мы рассмотрим некоторые основные функции даты, различные возможности их применения, лучшую практику и различие в выполнении операций с датами в SQL Server, Oracle и PostgreSQL, а также различие типов данных Date и Time.
Различные типы данных даты и времени
Сначала давайте взглянем на различные типы данных, перечисленные в следующей таблице:
SQL Server

Oracle

PostgreSQL

Простые операции с датами
Как видим, уже имеются некоторые отличия в рассматриваемых типах данных. Давайте теперь рассмотрим простые операции с датами. Как всегда, мы будем использовать бесплатно загружаемый образец базы данных github Chinook, поскольку он доступен в нескольких форматах СУБД по этой ссылке: https://github.com/cwoodruff/ChinookDatabase. Эта база представляет собой симуляцию магазина цифровых медиа с некоторым набором данных. Все что вам нужно сделать, это загрузить подходящую версию, и вы получите необходимые скрипты для создания структуры данных и вставки всех данных.
SQL Server
Наиболее частой операцией с датами является получение актуального значения даты-времени. В SQL Server это легко делается с помощью функции getdate(), которая возвращает текущее значение даты-времени.
select getdate() as actual_date

Это легко, и при этом возвращается фактические дата и время. Но что если вы хотите отформатировать это значение, чтобы выводилась только дата? Тогда мы можем выполнить преобразование результата:
select cast(getdate() as date) as actual_date

Кроме того, имеется стандартная функция (ANSI SQL), которая делает то же самое:
select CURRENT_TIMESTAMP

Oracle
Если мы попытаемся сделать то же самое в Oracle, то придем к совершенно другим функциям. Во-первых, для получения актуальной даты/времени мы должны использовать функцию sysdate:
select sysdate as actual_date from dual;
Помним также, что в Oracle нельзя выполнять запрос без предложения FROM, поэтому мы всегда добавляем предложение from dual.

Помимо этого, в Oracle возвращаемый результат зависит от национального форматирования сессии, именно поэтому сейчас мы видим только дату. Но если мы применим форматирование даты:
select to_char(sysdate, 'dd-mm-yyyy hh24:mi:ss') as actual_date from dual;

то увидим как дату, так и время. А если захотим получить только дату, используется функция trunc:
select to_char(trunc(sysdate), 'dd-mm-yyyy hh24:mi:ss') as actual_date from dual;

PostgreSQL
В PostgreSQL у нас имеется другая функция или, более точно, более одной функции, и все они соответствуют стандарту ANSI SQL. Например, вы можем вернуть текущую дату и время с помощью CURRENT_TIMESTAMP:
SELECT CURRENT_TIMESTAMP;

Если потребуется вернуть время с меньшей точностью, мы можем использовать ту же функцию с точностью в скобках:
SELECT CURRENT_TIMESTAMP(0);

Обратите внимание, что при использовании CURRENT_TIMESTAMP также выводится часовой пояс.
Если мы хотим вернуть только дату или время, в PostgreSQL имеются следующие функции:
SELECT CURRENT_DATE;

SELECT CURRENT_TIME;

Добавить и вычесть из даты
Теперь давайте выполним некоторые операции с этими датами, одной из наиболее востребованных является добавление или вычитание некоторой величины времени к/из даты.
SQL Server
Для этой цели в SQL Server у нас имеется функция DATEADD. Давайте рассмотрим пример, добавляющий 5 дней к фактической дате:
select dateadd(d,5,getdate()) as actual_5_days

По синтаксису: первый параметр — это интервал, он может быть днями, годами, месяцами, неделями и т.д. Второй параметр представляет собой число, которое нужно добавить, и, наконец, дата, к которой добавляется данное число интервалов.
Предположим теперь, что нам нужно добавить 5 дней к фактической дате, но выводить время нам не нужно, только дату. Мы должны преобразовать результат функции GETDATE(), как мы это делали раньше.
select dateadd(d,5,cast(getdate() as date)) as actual_5_days

Пусть теперь нам нужно добавить 7 дней к дате счета в таблице Invoice базы данных Chinook, чтобы получить дату оплаты счетов на сумму более 20 евро:
select Invoicedate, dateadd(d,7,Invoicedate) as PaymentDate, Total
from Invoice
where total>20

Довольно легко, нет? Теперь предположим, что нам нужно вычесть неделю из фактической даты:
select dateadd(WEEK,-1,cast(getdate() as date)) as week_before

Обратите внимание, что мы используем ту же функцию DATEADD() также и для вычитания, но с использованием отрицательного числа!
Oracle
Теперь попробуем выполнить те же самые операции в Oracle. Сначала добавим 5 дней к фактической дате:
select sysdate+5 as actual_5_days from dual;

Как видно, в Oracle это сделать очень просто — вы просто используете + для добавления интервала. Как вы могли заметить, число здесь представляет дни, поэтому, если мы хотим добавить час, то можем сделать это с помощью дробной части:
select to_char(sysdate+1/24,'dd/mm/yyyy hh24:mm:ss') as actual_1_hour from dual;

Как и ранее, если нам нужна только дата, мы используем функцию TRUNC:
select to_char(TRUNC(sysdate)+5,'dd/mm/yyyy hh24:mm:ss') as actual_5_DAYS from dual;

Теперь давайте, как и для SQL Server, добавим 7 дней к дате счета:
select Invoicedate, Invoicedate+7 as PaymentDate, Total
from chinook.Invoice
where total>20

Очень легко, а теперь вычтем неделю:
select sysdate as actual, sysdate-7 as week_before from dual;

Мы можем такте применить все то форматирование, которое мы видели ранее:
select to_char(sysdate,'mm/dd/yyyy') as actual, to_char(sysdate-7,'mm/dd/yyyy') as week_before from dual;

PostgreSQL
Теперь в PostgreSQL:
select current_date as actual_date, current_date+5 as actual_5_days;

И опять здесь мы встречаем почти синтаксис Oracle, заметная разница имеется в способе, которым мы можем определить интервалы времени, отличные от 1 дня:
select current_timestamp as actual_date, current_timestamp+interval '1 hour' as actual_1_hour;

Давайте теперь добавим 7 дней к InvoiceDate. Обратите внимание, что, поскольку столбец InvoiceDate имеет тип данных timestamp, нам нужно задать интервал; если бы мы просто написали 7, то получим ошибку.
select "InvoiceDate","InvoiceDate"+ interval '7 days' as PaymentDate, "Total"
from "Invoice"
where "Total">20

Аналогично для вычитания:
select current_date as actual_date, current_date -7 as date_week_before

Имея функцию current_date, которая возвращает тип данных date, я могу просто использовать целое число, и оно будет неявно полагаться днями. Если вместо этого использовать current_timestamp, нам необходимо будет указывать интервал:
select current_timestamp as actual_date, current_timestamp - interval '7 days' as date_week_before

Диапазон времени между двумя датами
Другой общей операцией с датами является получение интервала времени между двумя датами.
SQL Server
Для этой цели в SQL Server используется функция DATEDIFF. Предположим, что нам необходимо получить среднее время, прошедшее между одной покупкой и следующей (следующая строка) для каждого клиента. Я использую готовый код, применяющий оконные функции, но объясняю только синтаксис SELECT DATEDIFF:
;WITH InvCust AS
(SELECT DISTINCT CustomerID,
InvoiceDate AS cur_d,
next_d = LEAD(InvoiceDate, 1) OVER (PARTITION BY CustomerID ORDER BY InvoiceDate)
FROM Invoice)
,customer_avg as
(SELECT CustomerID,cur_d
,next_d
,dif_day = DATEDIFF(DAY, cur_d, next_d)
,avg_cust = AVG(DATEDIFF(DAY, cur_d, next_d)) OVER (PARTITION BY CustomerID)
,avg_all = AVG(DATEDIFF(DAY, cur_d, next_d)) OVER ()
FROM InvCust)
select distinct customer.customerid, FirstName + ' ' + lastname as Customer, country,avg_cust, avg_all
from customer_avg
inner join customer
on Customer.CustomerId=customer_avg.CustomerId
order by avg_cust

Итак, функция DATEDIFF довольно простая, т.к. мы должны только задать единицы, в которых мы хотим получить разницу, затем первую дату и вторую дату.
Oracle
WITH InvCust AS
(SELECT DISTINCT CustomerID,
InvoiceDate AS cur_d, LEAD(InvoiceDate, 1) OVER (PARTITION BY CustomerID ORDER BY InvoiceDate) as next_d
FROM chinook.Invoice)
,customer_avg as
(SELECT CustomerID,cur_d, next_d
,(next_d-cur_d)as dif_day, AVG((next_d-cur_d)) OVER (PARTITION BY CustomerID) as avg_cust
,AVG(next_d-cur_d) OVER () as avg_all
FROM InvCust)
select distinct customer.customerid,FirstName||' '||lastname as Customer, country,cast(avg_cust as decimal(5,2)) as avg_customer, cast(avg_all as decimal(5,2)) as avg_allcust
from customer_avg
inner join chinook.customer
on Customer.CustomerId=customer_avg.CustomerId
order by avg_customer, customerid;

В Oracle все еще проще, просто вычитание одной даты из другой, и вы автоматически получаете разницу в днях!
PostgreSQL
WITH InvCust AS
(SELECT DISTINCT "CustomerId",
"InvoiceDate" AS cur_d, LEAD("InvoiceDate", 1) OVER (PARTITION BY "CustomerId" ORDER BY "InvoiceDate") as next_d
FROM "Invoice")
,customer_avg as
(SELECT "CustomerId",cur_d, next_d
,next_d-cur_d as dif_day, AVG(next_d-cur_d) OVER (PARTITION BY "CustomerId") as avg_cust
,AVG(next_d-cur_d) OVER () as avg_all
FROM InvCust)
select distinct "Customer"."CustomerId","FirstName"||' '||"LastName" as Customer, "Country",avg_cust, avg_all
from customer_avg
inner join "Customer"
on "Customer"."CustomerId"=customer_avg."CustomerId"
order by avg_cust;

И то же самое в PostgreSQL, хотя в этой СУБД мы также имеем функцию AGE. Поэтому давайте напишем тот же запрос с использованием этой функции:
WITH InvCust AS
(SELECT DISTINCT "CustomerId",
"InvoiceDate" AS cur_d, LEAD("InvoiceDate", 1) OVER (PARTITION BY "CustomerId" ORDER BY "InvoiceDate") as next_d
FROM "Invoice")
,customer_avg as
(SELECT "CustomerId",cur_d,next_d
,age(next_d,cur_d) as dif_day,AVG(age(next_d,cur_d)) OVER (PARTITION BY "CustomerId") as avg_cust
,AVG(age(next_d,cur_d)) OVER () as avg_all
FROM InvCust)
select distinct "Customer"."CustomerId","FirstName"||' '||"LastName" as Customer, "Country",avg_cust, avg_all
from customer_avg
inner join "Customer"
on "Customer"."CustomerId"=customer_avg."CustomerId"
order by avg_cust;

Как видно, результат представлен уже не в днях, а преобразуется в месяцы и годы (если интервал достаточно велик). Подобный результат мы можем получить вычетанием из current_date:
select age(timestamp'2014-01-01')

Обратите внимание, что мы передаем дату в формате штампа времени, используя функцию timestamp вместе с литералом даты.
Извлечение из даты компоненты даты
Другой обычной операцией, которую мы выполняем с датами является извлечение из даты её компоненты, например, года или месяца.
SQL Server
В SQL Server для этого мы можем использовать по сути 4 различных функции, в зависимости от того, что мы хотим получить, но очевидно, что практически все можно сделать с функцией DATEPART:
SELECT getdate() as actual_date,
DATEPART(d,getdate()) as date_day,
DATEPART(month,getdate()) as date_month,
DATEPART(year,getdate()) as date_year

Как видно, это довольно легко, просто укажите требуемую компоненту даты, дату, и все сделано! Но этого можно достичь также и другим способом:
SELECT getdate() as actual_date,
day(getdate()) as date_day,
month(getdate()) as date_month,
year(getdate()) as date_year

Те же результаты, используя непосредственно функции DAY, MONTH и YEAR.
Oracle
В Oracle мы получаем те же результаты с помощью функции EXTRACT:
SELECT SYSDATE AS ACTUAL_DATE,
EXTRACT(DAY FROM SYSDATE) AS ACTUAL_DAY,
EXTRACT(MONTH FROM SYSDATE) AS ACTUAL_MONTH,
EXTRACT(YEAR FROM SYSDATE) AS ACTUAL_YEAR FROM DUAL;

Довольно просто, и почти тот же синтаксис, что и в SQL Server!
PostgreSQL
В PostgreSQL имеется по сути 2 функции, чтобы сделать одно и то же, так как у нас имеется и date_part, и extract:
SELECT current_date AS ACTUAL_DATE,
EXTRACT(DAY FROM current_date) AS ACTUAL_DAY,
EXTRACT(MONTH FROM current_date) AS ACTUAL_MONTH,
EXTRACT(YEAR FROM current_date) AS ACTUAL_YEAR

Это в точности тот же синтаксис, как и в Oracle, а теперь date_part:
SELECT current_date AS ACTUAL_DATE,
date_part('day',current_date) AS ACTUAL_DAY,
date_part('month', current_date) AS ACTUAL_MONTH,
date_part('year', current_date) AS ACTUAL_YEAR

Незначительное отличие от синтаксиса SQL Server, но почти то же самое. Заметим, что функцией стандарта ANSI SQL в данном случае является EXTRACT.
Обратные ссылки
Нет обратных ссылок
Комментарии
Показывать комментарии Как список | Древовидной структурой
Автор не разрешил комментировать эту запись
Как получить текущую дату sql
SELECT Cast(CAST(getdate() AS DateTime) As int)
так получаю только дни 40652
милисекунд от чего? Р.Х.?
SELECT GETDATE()
или проще datepart
(2) да, так с со временем, но мне нужно выразить числом
(1) SELECT Cast(0 as DateTime) = 01.01.1900 видимо от этой даты
(3) так выходит число, но есть проблема. завтра продолжу
select datediff(ms,cast(getdate() as date), getdate());
Для отображения даты с использованием миллисекунд, используйте функцию преобразования:
select convert(char(26), getdate(), 109)
Например, получим: Aug 19 1997 12:45:59:650PM
(0) тебя научить делить на 3600000?
(7)+
Изменение формата отображения даты
Стиль параметр преобразования предоставляет различные форматы отображения даты для преобразования DateTime или smalldatetime данных на персонаж или VARCHAR. Количество аргументов вы поставить как стиль параметр определяет, как данные отображаются. Года может быть выражена или в 2 цифры или 4 цифры. Добавить 100 в стиле значение, чтобы получить 4-значный год, в том числе века (гггг).
Таблица 10-14 показывает возможные значения для стиля и различные форматы дат можно использовать. При использовании стиля с smalldatetime, стилей, которые включают секунды или миллисекунды покажет нули на этих должностях.
Преобразование форматов дат со стилем параметра
Без века (гг) С века (гггг) Стандартный Выход
— 0 или 100 По умолчанию Пн дд гггг чч: мм AM (или ПМ)
1 101 США мм / дд / гг
2 2 SQL стандарт yy.mm.dd
3 103 Английском и французском языках дд / мм / гг
4 104 Немецкий дд.мм.гг
5 105 DD-MM-YY
6 106 дд пн гг
7 107 Пн дд, гг
8 108 чч: мм: сс
— 9 или 109 По умолчанию + миллисекунды Пн дд гггг чч: мм: SSS AM (или ПМ)
10 110 США MM-DD-YY
11 111 Япония гг / мм / дд
12 112 ISO YYMMDD
Значения по умолчанию, тип 0 или 100, 9 или 109, всегда возвращаются века (гггг).
(8) да, о мудрейший, научи меня.
Вот это число 3F 46 C1 6C 18 = 271770020888 из помогите расшифровать структуру каким то образом отражает первую секунду дня. Я хочу средствами SQL получить дату-время из этого число, что бы там была 1ая секунда для. Предположительная база даты — это 30.12.1899 0:00:00 из помогите расшифровать структуру
(6) select datediff(mi,cast(‘1899-12-30 00:00:00.00’ as datetime), getdate());
ниже минут уже вызывает переполнение
