# 时间和日期基本函数
 #### day(date \| timestamp with time zone)
描述：获取给定日期时间中的日（即月份中的第几天）。与[dayofmonth(date)]函数相同。
取值范围：1\~31
返回值类型：integer
示例：
```
SELECT day('2025-06-28');
 day
-----
  28
(1 row)
SELECT day('2025-06-28 09:00:00+08');
 day
-----
  28
(1 row)
```
 #### weekday(date \| timestamp with time zone)
描述：获取给定日期时间对应的星期值，星期一作为一周的开始日。
取值范围：0\~6
返回值类型：integer
示例：
```
SELECT weekday('2020-11-06');
 weekday
---------
       4
(1 row)
SELECT weekday('2020-11-06 09:00:00+08');
 weekday
---------
       4
(1 row)
```
 #### week(date\[, mode\])
描述：根据模式（mode）返回指定日期时间所处年份中对应的周数，默认模式为0。
- date，表示要获取周数的日期。
- mode，可选参数，指定不同的模式来计算一周的开始和一年的第一周。默认一周的第一天是星期日，也可以指定一周是从星期一还是星期日开始。mode支持的格式如下表所示。
返回值类型：integer
表1week函数中mode模式的工作原理 
| 模式   | 一周的第一天 | 周数范围    | 第一周的判断规则                                   |
|:---|:---|:---|:---|
| 0 | 星期日   | 0-53  | 从本年的第一个星期日开始，是第一周。前面的计算为第0周。                |
| 1   | 星期一  | 0-53   | 若1月1日到第一个周一的天数超过3天，则计算为本年的第一周。否则为第0周。      |
| 2    | 星期日   | 1-53  | 从本年的第一个星期日开始，是第一周。前面的计算为上年度的第5x周。            |
| 3  | 星期一  | 1-53   | 若1月1日到第一个周一的天数超过3天，则计算为本年的第一周。否则为上年度的第5x周。 |
| 4   | 星期日   | 0-53 | 若1月1日到第一个周日的天数超过3天，则计算为本年的第一周。否则为第0周。        |
| 5  | 星期一   | 0-53   | 从本年的第一个星期一开始，是第一周。前面的计算为第0周。               |
| 6  | 星期日   | 1-53  | 若1月1日到第一个周日的天数超过3天，则计算为本年的第一周。否则为上年度的第5x周。   |
| 7    | 星期一   | 1-53  | 从本年的第一个星期一开始，是第一周。前面的计算为上年度的第5x周。           |
   
示例：
获取指定日期的对应周数，默认模式0（周日为一周的第一天）。
```
SELECT WEEK('2026-01-01');
 week
------
    0     -- 由于1月1日不在2026年的第一周，根据模式0的规则，它属于上一年的最后一周，因此返回0。
(1 row)
```
获取指定日期的对应周数，默认模式1（ISO 标准周一为一周的第一天）。
```
SELECT WEEK('2026-01-01', 1);
 week
------
    1   -- 根据模式1的规则，2026年1月1日属于当年的第一周。
(1 row)
```
 #### month(date \| timestamp with time zone)
描述：获取给定日期时间的月份部分。
返回值类型：integer
示例：
```
SELECT month('2025-11-30');
 month
-------
    11
(1 row)
SELECT month('2025-11-30 09:00:00+08');
 month
-------
    11
(1 row)
```
 #### quarter(date \| timestamp with time zone)
描述：获取给定日期时间所属的季度。季度范围为1\~4。
返回值类型：integer
示例：
```
SELECT quarter(date '2025-12-13');
 quarter
---------
       4
(1 row)
SELECT quarter('2025-03-20 09:00:00+08');
 quarter
---------
       1
(1 row)
```
 #### year(date \| timestamp with time zone)
描述：获取给定日期时间所处的年份。
返回值类型：integer
示例：
```
SELECT year('2025-11-13');
 year
------
 2025
(1 row)
SELECT year('2025-11-13 09:00:00+08');
 year
------
 2025
(1 row)
```
 #### yearweek(date \| timestamp with time zone\[, mode\])
描述：获取给定日期时间在本年中对应的年份和周数，周数范围为1\~53。
返回值类型：integer
示例：
```
SELECT yearweek('2025-11-13');
 yearweek
----------
   202545
(1 row)
SELECT yearweek('2025-1-1');
 yearweek
----------
   202452
(1 row)
```
 #### dayofweek(date \| timestamp with time zone)
描述：获取给定日期时间对应的星期值，星期日作为一周的开始日。
取值范围：1\~7
返回值类型：integer
示例：
```
SELECT dayofweek('2025-11-22');
 dayofweek
-----------
         7
(1 row)
SELECT dayofweek('2025-11-22 09:00:00+08');
 dayofweek
-----------
         7
(1 row)
```
 #### dayofmonth(date \| timestamp with time zone)
描述：获取给定日期时间所处月份中的天数。
取值范围：1\~31
返回值类型：integer
示例：
```
SELECT dayofmonth('2025-10-28');
 dayofmonth
------------
         28
(1 row)
SELECT dayofmonth('2025-10-28 09:00:00+08');
 dayofmonth
------------
         28
(1 row)
```
 #### dayofyear(date \| timestamp with time zone)
描述：获取给定日期时间在本年中是第几天。1月1日为第1天，12月31日为365或366天。
取值范围：1\~366
返回值类型：integer
示例：
```
SELECT dayofyear('2025-10-28');
 dayofyear
-----------
       301
(1 row)
SELECT dayofyear('2025-10-28 09:00:00+08');
 dayofyear
-----------
       301
(1 row
```
 #### weekofyear(date \| timestamp with time zone)
描述：获取给定日期时间在本年中是第几周，等价于week(date, 3)。
取值范围：1\~53
返回值类型：integer
示例：
```
SELECT weekofyear('2025-11-30');
 weekofyear
------------
         48
(1 row)
SELECT weekofyear('2025-11-30 09:00:00+08');
 weekofyear
------------
         48
(1 row)
```
 #### makedate(year, dayofyear)
描述：根据给定的年份和一年中的第几天生成对应的日期值。
返回值类型：date
示例：
```
SELECT makedate(2025, 60);
  makedate
------------
 2025-03-01
(1 row)
```
 #### maketime(hour, minute, second)
描述：根据给定的小时、分钟和秒数生成时间值。
由于DWS中的time类型的取值范围为00:00:00到24:00:00, 故不支持hour大于24时和hour小于0时的场景。
返回值类型：time
示例：
```
SELECT maketime(12, 15, 30.12);
  maketime
-------------
 12:15:30.12
(1 row)
```
 #### hour(timestamp with time zone)
描述：获取时间中的小时值。
返回值类型：integer
示例：
```
SELECT hour(timestamptz '2025-12-13 12:11:15+06');
 hour
------
   14
(1 row)
```
 #### minute(timestamp with time zone)
描述：获取时间中的分钟值。
返回值类型：integer
示例：
```
SELECT minute(timestamptz '2025-12-13 12:11:15+06');
 minute
--------
     11
(1 row)
```
 #### second(timestamp with time zone)
描述：获取时间的秒数值。
返回值类型：integer
示例：
```
SELECT second(timestamptz '2025-12-13 12:11:15+06');
 second
--------
     15
(1 row)
```
 #### microsecond(timestamp with time zone)
描述：获取时间中的微秒值。
返回值类型：integer
示例：
```
SELECT microsecond(timestamptz '2025-12-13 12:11:15.123634+06');
 microsecond
-------------
      123634
(1 row)
```
 #### from_unixtime(unix_timestamp\[,format\])
描述：格式串缺省时，将unix时间戳转换为日期时间类型输出。格式串指定时，将unix时间戳转换为指定格式的字符串输出。
返回值类型：timestamp（格式串缺省）/ text（格式串指定）
示例：
```
SELECT from_unixtime(875996580);
    from_unixtime
---------------------
 1997-10-04 20:23:00
(1 row)
SELECT from_unixtime(875996580, '%Y %D %M %h:%i:%s');
       from_unixtime
---------------------------
 1997 5th October 04:23:00
(1 row)
```
 #### unix_timestamp(\[timestamp with time zone\])
描述：用于将日期时间值转换为 Unix时间戳（即自1970-01-01 00:00:00 UTC以来经过的秒数）。无入参时，指定为当前时间。
返回值类型：bigint（无入参）/numeric（有入参）
示例：
```
SELECT unix_timestamp();
 unix_timestamp
----------------
     1768793418
(1 row)
```
```
SELECT unix_timestamp('2025-09-08 12:11:13+06');
    unix_timestamp
-------------------
 1757311873.000000
(1 row)
```
 #### now(\[fsp\])
描述：当前事务开始的日期及时间。入参确定微秒输出精度，缺省时为6。
返回值类型：timestamp with time zone
示例：
```
SELECT now();
              now              
-------------------------------
 2026-01-19 11:35:09.082256+08
(1 row)
```
```
SELECT now(3);
             now    
---------------------------- 
 2026-01-19 11:35:31.839+08
(1 row)
```
 #### last_day(d)
描述：获取日期或者日期时间中对应月份的最后一天。
返回值类型：
- ORA和TD兼容模式下，返回值类型为timestamp。
- MySQL兼容模式下，返回值类型为date。
示例：
```
SELECT last_day(to_date('2026-01-01', 'YYYY-MM-DD')) AS cal_result;
     cal_result      
---------------------
 2026-01-31 00:00:00
(1 row)
```
 #### next_day(x,y)
描述：用于计算给定时间（x）之后第一个匹配目标星期几（y）的日期。
返回值类型：
- ORA和TD兼容模式下，返回值类型为timestamp。
- MySQL兼容模式下，返回值类型为date。
示例：
```
SELECT next_day(timestamp '2025-05-21 00:00:00','Sunday')AS cal_result;
     cal_result      
---------------------
 2025-05-25 00:00:00
(1 row)
```
 #### from_days(days)
描述：根据给定的天数，返回对应的日期值。
返回值类型：date
示例：
```
SELECT from_days(730669);
 from_days
------------
 2000-07-03
(1 row)
```
 #### to_days(timestamp)
描述：根据指定日期，返回自0年开始的天数。
返回值类型：integer
示例：
```
SELECT to_days(timestamp '2025-10-07');
 to_days
---------
  739896
(1 row)
```
