中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PostgreSQL的日期時間差DATEDIFF怎么使用

發布時間:2023-04-15 17:00:03 來源:億速云 閱讀:118 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“PostgreSQL的日期時間差DATEDIFF怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“PostgreSQL的日期時間差DATEDIFF怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

    PostgreSQL-DATEDIFF-日期時間差,以秒,天,月,周等為單位

    您可以使用各種日期時間表達式或用戶定義的 DATEDIFF 函數(UDF)在 PostgreSQL 中計算兩個日期時間值之間的差,以秒,分鐘,小時,天,周,月和年為單位。

    總覽

    PostgreSQL 不提供類似于 SQL Server DATEDIFF 的[2] DATEDIFF 函數,但是您可以使用各種表達式或 UDF 來獲得相同的結果。


    SQL Server
    and Sybase
    PostgreSQL
    YearsDATEDIFF(yy, start, end)DATE_PART('year', end) - DATE_PART('year', start)
    MonthsDATEDIFF(mm, start, end)years_diff * 12 + (DATE_PART('month', end) - DATE_PART('month', start))
    DaysDATEDIFF(dd, start, end)DATE_PART('day', end - start)
    WeeksDATEDIFF(wk, start, end)TRUNC(DATE_PART('day', end - start)/7)
    HoursDATEDIFF(hh, start, end)days_diff * 24 + DATE_PART('hour', end - start )
    MinutesDATEDIFF(mi, start, end)hours_diff * 60 + DATE_PART('minute', end - start )
    SecondsDATEDIFF(ss, start, end)minutes_diff * 60 + DATE_PART('minute', end - start )

    PostgreSQL-年中的日期差異

    考慮使用 SQL Server 函數來計算以年為單位的兩個日期之間的差:

    SQL Server

      -- Difference between Oct 02, 2011 and Jan 01, 2012 in years
      SELECT DATEDIFF(year, '2011-10-02', '2012-01-01');
      -- Result: 1

    請注意,SQL Server DATEDIFF 函數返回 1 年,盡管日期之間只有 3 個月。

    SQL Server 不計算日期之間經過的整年,它僅計算年份之間的差異。

    在 PostgreSQL 中,您可以從日期中獲取年份部分并將其減去。

    PostgreSQL

     -- Difference between Oct 02, 2011 and Jan 01, 2012 in years
      SELECT DATE_PART('year', '2012-01-01'::date) - DATE_PART('year', '2011-10-02'::date);
      -- Result: 1

    PostgreSQL-月中的日期差異

    考慮使用 SQL Server 函數來計算兩個日期(以月為單位)之間的差額:

    SQL Server

      -- Difference between Oct 02, 2011 and Jan 01, 2012 in months
      SELECT DATEDIFF(month, '2011-10-02', '2012-01-01');
      -- Result: 3

    在 PostgreSQL 中,您可以將年份之間的差值乘以 12,然后將月份部分之間的差值相加(可以為負)。

    PostgreSQL

    -- Difference between Oct 02, 2011 and Jan 01, 2012 in months
      SELECT (DATE_PART('year', '2012-01-01'::date) - DATE_PART('year', '2011-10-02'::date)) * 12 +
                  (DATE_PART('month', '2012-01-01'::date) - DATE_PART('month', '2011-10-02'::date));
      -- Result: 3

    PostgreSQL-日期的天數差異

    考慮使用 SQL Server 函數來計算兩天之間的日期差:

    SQL Server

     -- Difference between Dec 29, 2011 23:00 and Dec 31, 2011 01:00 in days
      SELECT DATEDIFF(day, '2011-12-29 23:00:00', '2011-12-31 01:00:00');
      -- Result: 2

    請注意,DATEDIFF 返回了 2 天,盡管 datetime 值之間只有 1 天 2 小時。

    在 PostgreSQL 中,如果您從另一個中減去一個日期時間值(TIMESTAMP,DATE 或 TIME 數據類型),則將獲得一個 INTERVAL 值,格式為“ ddd days hh:mi:ss ”。

       SELECT '2011-12-31 01:00:00'::timestamp - '2011-12-29 23:00:00'::timestamp;
        -- Result: "1 day 02:00:00"
     
        SELECT '2011-12-31 01:00:00'::timestamp - '2010-09-17 23:00:00'::timestamp;
        -- Result: "469 days 02:00:00"

    所以,你可以使用 date_part 數函數 extact 的天數,但它返回的數量充分的日期之間的天數。

    PostgreSQL

     -- Difference between Dec 29, 2011 23:00 and Dec 31, 2011 01:00 in days
      SELECT DATE_PART('day', '2011-12-31 01:00:00'::timestamp - '2011-12-29 23:00:00'::timestamp);
      -- Result: 1

    PostgreSQL-周中的日期差異

    考慮使用 SQL Server 函數來計算兩周中兩個日期之間的差額:

    SQL Server

    -- Difference between Dec 22, 2011 and Dec 31, 2011 in weeks
      SELECT DATEDIFF(week, '2011-12-22', '2011-12-31');
      -- Result: 1

    DATEDIFF 返回日期時間值之間的整周數。

    在 PostgreSQL 中,您可以使用表達式定義天數(請參見上文)并將其除以 7。需要 TRUNC 才能刪除除后的小數部分。

    PostgreSQL

      -- Difference between Dec 22, 2011 and Dec 31, 2011 in weeks
      SELECT TRUNC(DATE_PART('day', '2011-12-31'::timestamp - '2011-12-22'::timestamp)/7);
      -- Result: 1

    PostgreSQL-日期時間的小時差異

    考慮使用 SQL Server 函數來計算兩個 datetime 值之間的時差,以小時為單位:

    SQL Server

      -- Difference between Dec 30, 2011 08:55 and Dec 30, 2011 9:05 in weeks
      SELECT DATEDIFF(hour, '2011-12-30 08:55', '2011-12-30 09:05');
      -- Result: 1

    請注意,盡管 datetime 值之間只有 10 分鐘的差異,但 DATEDIFF 返回了 1 小時。

    在 PostgreSQL 中,您可以使用表達式來定義天數(請參見上文),乘以 24 并乘以小時。

    PostgreSQL

     -- Difference between Dec 30, 2011 08:55 and Dec 30, 2011 9:05 in weeks
      SELECT DATE_PART('day', '2011-12-30 08:55'::timestamp - '2011-12-30 09:05'::timestamp) * 24 +
                  DATE_PART('hour', '2011-12-30 08:55'::timestamp - '2011-12-30 09:05'::timestamp);
      -- Result: 0

    請注意,此 PostreSQL 表達式返回在 datetime 值之間傳遞的完整小時數。

    PostgreSQL-分鐘中的日期時間差異

    考慮使用 SQL Server 函數以分鐘為單位計算兩個日期時間值之間的差:

    SQL Server

      -- Difference between Dec 30, 2011 08:54:55 and  Dec 30, 2011 08:56:10 in minutes
      SELECT DATEDIFF(minute, '2011-12-30 08:54:55', '2011-12-30 08:56:10');
      -- Result: 2
     
      -- Time only
      SELECT DATEDIFF(minute, '08:54:55', '08:56:10');
      -- Result: 2

    請注意,盡管 datetime 值之間只有 1 分 15 秒,但 DATEDIFF 返回了 2 分鐘。

    在 PostgreSQL 中,您可以使用一個表達式來定義小時數(請參閱上文),乘以 60 并乘以分鐘。

    PostgreSQL

    -- Difference between Dec 30, 2011 08:54:55 and  Dec 30, 2011 08:56:10 in minutes
      SELECT (DATE_PART('day', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp) * 24 +
                   DATE_PART('hour', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp)) * 60 +
                   DATE_PART('minute', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp);
      -- Result: 1
     
      -- Time only
      SELECT DATE_PART('hour', '08:56:10'::time - '08:54:55'::time) * 60 +
                  DATE_PART('minute', '08:56:10'::time - '08:54:55'::time);
      -- Result: 1

    請注意,這些 PostreSQL 表達式返回在 datetime 值之間傳遞的完整分鐘數。

    PostgreSQL-日期時間差(以秒為單位)

    考慮使用 SQL Server 函數以秒為單位計算兩個日期時間值之間的差:

    SQL Server

      -- Difference between Dec 30, 2011 08:54:55 and  Dec 30, 2011 08:56:10 in seconds
      SELECT DATEDIFF(second, '2011-12-30 08:54:55', '2011-12-30 08:56:10');
      -- Result: 75
     
      -- Time only
      SELECT DATEDIFF(second, '08:54:55', '08:56:10');
      -- Result: 75

    在 PostgreSQL 中,您可以使用表達式定義分鐘數(請參見上文),乘以 60 并乘以秒。

    PostgreSQL

    -- Difference between Dec 30, 2011 08:54:55 and  Dec 30, 2011 08:56:10 in seconds
      SELECT ((DATE_PART('day', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp) * 24 +
                    DATE_PART('hour', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp)) * 60 +
                    DATE_PART('minute', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp)) * 60 +
                    DATE_PART('second', '2011-12-30 08:56:10'::timestamp - '2011-12-30 08:54:55'::timestamp);
      -- Result: 75
     
      -- Time only
      SELECT (DATE_PART('hour', '08:56:10'::time - '08:54:55'::time) * 60 +
                   DATE_PART('minute', '08:56:10'::time - '08:54:55'::time)) * 60 +
                   DATE_PART('second', '08:56:10'::time - '08:54:55'::time);
      -- Result: 75

    PostgreSQL DATEDIFF-用戶定義函數(UDF)

    除了使用單獨的表達式來計算每個時間單位的日期時間差之外,還可以使用類似于 SQL Server DATEDIFF 函數的函數。

    PostgreSQL

    CREATE OR REPLACE FUNCTION DateDiff (units VARCHAR(30), start_t TIMESTAMP, end_t TIMESTAMP)
         RETURNS INT AS $$
       DECLARE
         diff_interval INTERVAL;
         diff INT = 0;
         years_diff INT = 0;
       BEGIN
         IF units IN ('yy', 'yyyy', 'year', 'mm', 'm', 'month') THEN
           years_diff = DATE_PART('year', end_t) - DATE_PART('year', start_t);
     
           IF units IN ('yy', 'yyyy', 'year') THEN
             -- SQL Server does not count full years passed (only difference between year parts)
             RETURN years_diff;
           ELSE
             -- If end month is less than start month it will subtracted
             RETURN years_diff * 12 + (DATE_PART('month', end_t) - DATE_PART('month', start_t));
           END IF;
         END IF;
     
         -- Minus operator returns interval 'DDD days HH:MI:SS'
         diff_interval = end_t - start_t;
     
         diff = diff + DATE_PART('day', diff_interval);
     
         IF units IN ('wk', 'ww', 'week') THEN
           diff = diff/7;
           RETURN diff;
         END IF;
     
         IF units IN ('dd', 'd', 'day') THEN
           RETURN diff;
         END IF;
     
         diff = diff * 24 + DATE_PART('hour', diff_interval);
     
         IF units IN ('hh', 'hour') THEN
            RETURN diff;
         END IF;
     
         diff = diff * 60 + DATE_PART('minute', diff_interval);
     
         IF units IN ('mi', 'n', 'minute') THEN
            RETURN diff;
         END IF;
     
         diff = diff * 60 + DATE_PART('second', diff_interval);
     
         RETURN diff;
       END;
       $$ LANGUAGE plpgsql;

    如何使用 PostgreSQL DATEDIFF 函數

    語法與 SQL Server DATEDIFF 相似,但是您必須在 PostgreSQL 中將時間單位(秒,分鐘等及其縮寫)指定為字符串文字,例如:

       -- Difference between Dec 30, 2011 08:54:55 and  Dec 30, 2011 08:56:10 in seconds
      SELECT DATEDIFF('second', '2011-12-30 08:54:55'::timestamp, '2011-12-30 08:56:10'::timestamp);
      -- Result: 75

    PostgreSQL DATEDIFF 函數僅適用于 TIME

    您可以具有另一個僅對時間數據類型起作用的函數。PostgreSQL 支持具有相同名稱但參數數據類型不同的重載函數:

    CREATE OR REPLACE FUNCTION DateDiff (units VARCHAR(30), start_t TIME, end_t TIME)
         RETURNS INT AS $$
       DECLARE
         diff_interval INTERVAL;
         diff INT = 0;
       BEGIN
         -- Minus operator for TIME returns interval 'HH:MI:SS'
         diff_interval = end_t - start_t;
     
         diff = DATE_PART('hour', diff_interval);
     
         IF units IN ('hh', 'hour') THEN
           RETURN diff;
         END IF;
     
         diff = diff * 60 + DATE_PART('minute', diff_interval);
     
         IF units IN ('mi', 'n', 'minute') THEN
            RETURN diff;
         END IF;
     
         diff = diff * 60 + DATE_PART('second', diff_interval);
     
         RETURN diff;
       END;
       $$ LANGUAGE plpgsql;

    登錄后復制

    例如,可以將此函數調用為:

      -- Difference between 08:54:55 and 08:56:10 in seconds
      SELECT DATEDIFF('second', '08:54:55'::time, '08:56:10'::time);
      -- Result: 75

    讀到這里,這篇“PostgreSQL的日期時間差DATEDIFF怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    大悟县| 祁阳县| 富宁县| 屏南县| 资兴市| 柏乡县| 巴彦淖尔市| 高碑店市| 涿州市| 常宁市| 兴城市| 策勒县| 醴陵市| 琼结县| 龙泉市| 灵川县| 内丘县| 朝阳县| 雷州市| 延庆县| 安图县| 浦城县| 海口市| 东莞市| 县级市| 固安县| 扎赉特旗| 呼伦贝尔市| 高青县| 韶关市| 无为县| 和林格尔县| 沁源县| 当雄县| 德庆县| 高邑县| 福泉市| 南开区| 项城市| 彭州市| 马公市|