HGDB兼容MySQL date_format函數

2021-12-27 瀚高PG實驗室

收錄於話題 #Highgo DB 32個

目錄

環境

文檔用途

詳細信息

環境

系統平臺:Linux x86-64 Red Hat Enterprise Linux 7

版本:6.0,5.6.5,4.5,4.3.4.9

文檔用途

從MySQL資料庫遷移到瀚高資料庫,瀚高資料庫中沒有date_format函數,為滿足客戶需求需要自定義同名兼容函數。

詳細信息

--date_format函數主體:

CREATE OR REPLACE FUNCTION date_format(timestamp without time zone, text) RETURNS text LANGUAGE plpgsql IMMUTABLE STRICTAS $function$  DECLARE    i int := 1;    temp text := '';    c text;    n text;    res text;  BEGIN    WHILE i <= pg_catalog.length($2) LOOP      c := SUBSTRING ($2 FROM i FOR 1);      IF c = '%' AND i != pg_catalog.length($2) THEN        n := SUBSTRING ($2 FROM (i + 1) FOR 1);        SELECT INTO res CASE          WHEN n = 'a' THEN pg_catalog.to_char($1, 'Dy')           WHEN n = 'b' THEN pg_catalog.to_char($1, 'Mon')           WHEN n = 'c' THEN pg_catalog.to_char($1, 'FMMM')           WHEN n = 'D' THEN pg_catalog.to_char($1, 'FMDDth')           WHEN n = 'd' THEN pg_catalog.to_char($1, 'DD')           WHEN n = 'e' THEN pg_catalog.to_char($1, 'FMDD')           WHEN n = 'f' THEN pg_catalog.to_char($1, 'US')           WHEN n = 'H' THEN pg_catalog.to_char($1, 'HH24')           WHEN n = 'h' THEN pg_catalog.to_char($1, 'HH12')           WHEN n = 'I' THEN pg_catalog.to_char($1, 'HH12')                WHEN n = 'i' THEN pg_catalog.to_char($1, 'MI')           WHEN n = 'j' THEN pg_catalog.to_char($1, 'DDD')           WHEN n = 'k' THEN pg_catalog.to_char($1, 'FMHH24')           WHEN n = 'l' THEN pg_catalog.to_char($1, 'FMHH12')           WHEN n = 'M' THEN pg_catalog.to_char($1, 'FMMonth')           WHEN n = 'm' THEN pg_catalog.to_char($1, 'MM')           WHEN n = 'p' THEN pg_catalog.to_char($1, 'AM')           WHEN n = 'r' THEN pg_catalog.to_char($1, 'HH12:MI:SS AM')           WHEN n = 'S' THEN pg_catalog.to_char($1, 'SS')          WHEN n = 's' THEN pg_catalog.to_char($1, 'SS')          WHEN n = 'T' THEN pg_catalog.to_char($1, 'HH24:MI:SS')           WHEN n = 'U' THEN pg_catalog.lpad(week($1::date, 0)::text, 2, '0')          WHEN n = 'u' THEN pg_catalog.lpad(week($1::date, 1)::text, 2, '0')          WHEN n = 'V' THEN pg_catalog.lpad(week($1::date, 2)::text, 2, '0')          WHEN n = 'v' THEN pg_catalog.lpad(week($1::date, 3)::text, 2, '0')          WHEN n = 'W' THEN pg_catalog.to_char($1, 'FMDay')           WHEN n = 'w' THEN EXTRACT(DOW FROM $1)::text          WHEN n = 'X' THEN pg_catalog.lpad(((_calc_week($1::date, _week_mode(2)))[2])::text, 4, '0')          WHEN n = 'x' THEN pg_catalog.lpad(((_calc_week($1::date, _week_mode(3)))[2])::text, 4, '0')          WHEN n = 'Y' THEN pg_catalog.to_char($1, 'YYYY')           WHEN n = 'y' THEN pg_catalog.to_char($1, 'YY')          WHEN n = '%' THEN pg_catalog.to_char($1, '%')          ELSE NULL        END;        temp := temp operator(pg_catalog.||) res;        i := i + 2;      ELSE        temp = temp operator(pg_catalog.||) c;        i := i + 1;      END IF;     END LOOP;    RETURN temp;  END$function$;

(左右滑動查看完整內容)

--主體函數調用的其它函數

CREATE OR REPLACE FUNCTION _week_mode(mode integer)RETURNS integer AS $$  DECLARE    _WEEK_MONDAY_FIRST  CONSTANT integer := 1;    _WEEK_FIRST_WEEKDAY CONSTANT integer := 4;    week_format integer := mode & 7;  BEGIN    IF (week_format & _WEEK_MONDAY_FIRST) = 0 THEN      week_format := week_format # _WEEK_FIRST_WEEKDAY;    END IF;
RETURN week_format; END;$$ IMMUTABLE STRICT LANGUAGE PLPGSQL;
CREATE OR REPLACE FUNCTION _calc_weekday(qdate date, sundayfirst boolean)RETURNS integer AS $$ BEGIN RETURN (EXTRACT(DOW FROM qdate)::integer + CASE WHEN sundayfirst THEN 0 ELSE 6 END) % 7; END;$$ IMMUTABLE STRICT LANGUAGE PLPGSQL;
CREATE OR REPLACE FUNCTION _calc_days_in_year(year integer)RETURNS integer AS $$ BEGIN IF (year & 3) = 0 AND ((year % 100) <> 0 OR (year % 400) = 0 AND year <> 0) THEN RETURN 366; ELSE RETURN 365; END IF; END;$$ IMMUTABLE STRICT LANGUAGE PLPGSQL;
CREATE OR REPLACE FUNCTION _calc_week(qdate anyelement, behavior integer)RETURNS integer[] AS $$ DECLARE _WEEK_MONDAY_FIRST CONSTANT integer := 1; _WEEK_YEAR CONSTANT integer := 2; _WEEK_FIRST_WEEKDAY CONSTANT integer := 4; qyear integer := EXTRACT(YEAR FROM qdate); qmonth integer := EXTRACT(MONTH FROM qdate); qday integer := EXTRACT(DAY FROM qdate); daynr integer := EXTRACT(DOY FROM qdate); yday1 date := pg_catalog.date_trunc('year', qdate); first_daynr integer := 1; monday_first boolean := (behavior & _WEEK_MONDAY_FIRST) <> 0; week_year boolean := (behavior & _WEEK_YEAR) <> 0; first_weekday boolean := (behavior & _WEEK_FIRST_WEEKDAY) <> 0; weekday integer := _calc_weekday(yday1, NOT monday_first); days integer; BEGIN IF qmonth = 1 AND qday <= 7 - weekday THEN IF (NOT week_year) AND ((first_weekday AND weekday <> 0) OR (NOT first_weekday AND weekday >= 4)) THEN RETURN array[0, qyear]; END IF;
week_year := true; qyear := qyear - 1; days := _calc_days_in_year(qyear); first_daynr := first_daynr - days; weekday := (weekday + 53 * 7 - days) % 7; END IF;
IF (first_weekday AND weekday <> 0) OR (NOT first_weekday AND weekday >= 4) THEN days := daynr - (first_daynr + (7 - weekday)); ELSE days := daynr - (first_daynr - weekday); END IF;
IF week_year AND days >= 52 * 7 THEN weekday := (weekday + _calc_days_in_year(qyear)) % 7; IF (NOT first_weekday AND weekday < 4) OR (first_weekday AND weekday = 0) THEN qyear := qyear + 1; RETURN array[1, qyear]; END IF; END IF;
RETURN array[days / 7 + 1, qyear]; END;$$ IMMUTABLE STRICT LANGUAGE PLPGSQL;

CREATE OR REPLACE FUNCTION week(anyelement, integer) RETURNS integer LANGUAGE plpgsql IMMUTABLE STRICTAS $function$BEGIN IF is_datetime ( $1 ) THEN RETURN (_calc_week($1, _week_mode($2)))[1]; END IF; RAISE EXCEPTION 'Invalid date / time value --> %', $1;END;$function$;

(左右滑動查看完整內容)

--調用函數:

select DATE_FORMAT(now()::timestamp ,'%Y-%m-%d');select DATE_FORMAT(now()::timestamp,'%Y-%m-%d %H:%i');select DATE_FORMAT(now()::timestamp,'%Y');select DATE_FORMAT(now()::timestamp,'%Y-%m');select DATE_FORMAT(now()::timestamp,'%m-%d');select DATE_FORMAT(now()::timestamp,'%m-%d %H:%i');select DATE_FORMAT(now()::timestamp,'%Y年%m月%d日');select DATE_FORMAT(now()::timestamp,'%Y-%m-%d %H:%i:%s');

(左右滑動查看完整內容)

相關焦點

  • 【問答】MySQL DATE_FORMAT函數怎麼用?
    問: 在MySQL中如何使用DATE_FORMAT() 函數
  • MySQL日期、時間函數總結
    mysql> select now();+-+| now() |+-+| 2021-08-12 20:20:46 |+-+獲得當前日期+時間(date + time)函數:sysdate()sysdate()日期時間函數跟now()類似,不同之處在於:now()在執行開始時值就得到了,sysdate()在函數執行時動態得到值
  • MySQL 函數相關
    在以下格式的函數中可以對pos 使用一個負值。CURTIME()或CURRENT_TIME() 返回當前的時間    DAYOFWEEK(date)   返回date所代表的一星期中的第幾天(1~7)    DAYOFMONTH(date)  返回date是一個月的第幾天(1~31)    DAYOFYEAR(date)   返回date是一年的第幾天(1~366)    DAYNAME(date)   返回date
  • MySQL函數及用法示例(收藏大全)
    (date,interval expr type)  對日期時間進行加減法運算  (adddate()和subdate()是date_add()和date_sub()的同義詞,也可以用運算符+和-而不是函數  date是一個datetime或date值,expr對date進行加減法的一個表達式字符串type指明表達式expr應該如何被解釋   [type
  • 用MySQL 執行計劃分析 DATE_FORMAT 函數對索引的影響
    前言最近公司在代碼評審時,在使用DATE_FORMAT函數的問題上有了點不同的觀點。具體DATE_FORMAT對索引會不會產生影響?哪種情況下會產生影響呢?周末無事,通過mysql的執行計劃測試一波。CREATE TABLE `user`  (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,  `age` int(11) NULL DEFAULT NULL,  `birth_date
  • MYSQL—數據類型和常用函數(建議收藏)
    常用函數mysql內置函數列表可以從mysql官方文檔查詢,這裡僅分類簡單介紹一些可能會用到的函數。1.):返回一個unix時間戳('1970-01-01 00:00:00' UTC至今或者date的秒數),這實際上是從字符串到整數的一個轉化過程FROM_UNIXTIME(unix_timestamp), FROM_UNIXTIME(unix_timestamp,format):從時間戳返回'YYYY-MM-DD HH:MM:SS' 或者YYYYMMDDHHMMSS,加入format後根據所需的
  • MySQL常用函數,你真得看看!
    )       # str:要裁剪的字符串 , pos:要裁剪的長度substr(str,pos,len)   # str:要裁剪的字符串 , pos/len:從哪個位置開始裁剪幾位# substring同理instr:返回子串第一次出現的索引,如果沒有則返回0SELECT INSTR('蔡不菜','蔡')        # 輸出 1 (mysql
  • 筆記總結Date、Calendar、SimpleDateFormat和DecimalFormat
    (long time)//注意:設置的時間為固定不走的時間(定時)Date  date2 = new  Date();date2.setTime(1501179322396L);//Fri Jul 28 02:15:22 CST 2017System.out.println("設置的時間:"+date2);
  • MySQL中插入datetime時的PHP date()格式
    日期只能存儲此類型,但它可以與許多時間格式函數一起使用來更改並顯示它。當使用PHP在MySQL中編寫查詢時,它的適用性將基於MySQL本身進行檢查。$conn ) {     die("Connection failed: " . mysqli_connect_error()); }    $sql = "CREATE TABLE date_test (     id INT AUTO_INCREMENT PRIMARY KEY,     created_at
  • MySql中的時間和日期函數
    SELECT create_time ,date_format(create_time,'%Y-%m-%d %H:%i:%s') ,date_format(create_time函數說明addtime()、subtime()時間的加減adddate()、subdate()天數的加減period_add()月份的加減SELECT
  • 還在使用SimpleDateFormat?
    來看看SimpleDateFormat的format()方法的源碼:注意, calendar.setTime(date),SimpleDateFormat的format方法實際操作的就是Calendar。
  • SimpleDateFormat 如何安全的使用?
    (Date date) throws ParseException {11        return sdf.format(date);12    }1314    public static Date parse(String strDate) throws ParseException {15        return sdf.parse(strDate
  • SQL乾貨:Mysql日期時間函數
    ,我們也可以先通過now()函數獲取當前時刻的日期時間,然後再通過date()函數將日期時間轉化為日期部分,具體代碼如下:通過運行上面的代碼,會得到與curdate()函數相同的結果。在Sql中我們用的是date_format()函數,date_format函數格式如下:date_format(datetime,format)datetime表示要被轉換的具體的日期時間,format表示要轉換成的格式,可選的格式如下:主題格式描述年%Y4位數的年
  • 由一條create語句的問題對比mysql和oracle中的date差別 (r7筆記第26天)
    mysql> insert into test values(current_date,current_timestamp,current_date);Query OK, 1 row affected (0.00 sec)mysql> select *from test;+-+-+--+| date1 | date2
  • 為什麼SimpleDateFormat不是線程安全的?
    = simpleDateFormat.parse(dateString);            String newDate = simpleDateFormat.format(date).toString();            if(!
  • 一文搞定Mysql日期時間函數
    curdate()函數是直接獲取當前時刻的日期部分,我們也可以先通過now()函數獲取當前時刻的日期時間,然後再通過date()函數將日期時間轉化為日期部分,具體代碼如下:select date(now())通過運行上面的代碼,會得到與curdate()函數相同的結果。
  • 不簡單的 SimpleDateFormat
    (Date target) { return SIMPLE_DATE_FORMAT.format(target); }}你覺得它會像我們預期的那樣進行工作麼?static void testSimpleDateFormatWithThreads() { ExecutorService executorService = Executors.newFixedThreadPool(10); final String source = "2019-01-11"; System.out.println(":: parsing date
  • MySQL查詢,當日期邂逅字符串,該怎麼辦?
    前言在mys
  • MySQL時間類型
    使用now()函數可獲取當前時間mysql> create table temp(    ->         y year,  # 年    ->         ymd date,  # 年月日    ->         hms time,  # 時分秒    ->         ct datetime
  • 一文帶你搞定MySQL的日期和時間函數!
    返回當前時刻的日期和時間返回當前時刻的日期和時間在ESql中用的是now()函數,直接在select後面寫上now()函數即可,具體代碼如下:運行上面代碼就會得到你程序運行這一刻所處的年月日、時分秒的信息,比如:2019-12-25 22:47:37。2.