SQL 日期(Dates) 2019-10-17 22:17:26
當我們處理日期時,最難的任務恐怕是確保插入的日期的格式,與數據庫中日期列的格式相匹配。
保存的如果是日期部分,查詢不會有太大問題。但是如果涉及到時間部分,情況就有點復雜了。
下面我們先看看內建日期處理函數
SQL Server Date函數
下面列舉出了SQL Server中最重要的內建日期函數:
1、GETDATE() 返回當前日期和時間
語法:
GETDATE()
下面是SELECT語句:
SELECT GETDATE() AS DateTime
結果如下所示:
注釋:上面的時間是精確到毫秒。
2、DATEPART() 返回日期/時間的單獨部分
語法:
DATEPART(datepart,date)
date參數是合法的日期表達式。datepart參數可以是下列的值:
datepart | 縮寫 |
年 | yy,yyyy |
季度 | qq,q |
月 | mm,m |
年中的日 | dy,y |
日 | dd,d |
周 | wk,ww |
星期 | dw,w |
小時 | hh |
分鍾 | mi,n |
秒 | ss,s |
毫秒 | ms |
微秒 | mcs |
納秒 | ns |
實例:
select datepart(yy,getdate());
3、DATEADD() 在日期中添加或減去指定的時間間隔
語法:
DATEADD(datepart,number,date)
date參數是合法的日期表達式。number是您希望添加的間隔數;對於未來日期,次數是正數,對於過去的時間,次數是負數。
datepart參數值跟上面列舉的參數值一致,在此我就不復制一份了
實例:
select DATEADD(day,30,GETDATE());
結果:
4、DATEDIFF() 返回兩個日期之間的時間
語法:
DATEDIFF(datepart,startdate,enddate)
startdate和enddate 參數是合法的日期表達式。datepart參數跟上面列舉的一樣
實例:
select DATEDIFF(day,'2019-10-17','2020-1-24');
結果:
5、CONVART() 用不同的格式顯示日期/時間
語法:
CONVERT(data_type(length),expression,style)
值 | 描述 |
data_type(length) | 規定目標數據類型(帶有可選的長度)。 |
expressin | 規定需要轉換的值。 |
style | 規定日期/時間的輸出格式 |
下面的表格展示了datetime或smalldatetime轉換為字符數據的style值:
值(世紀yy) | 值(世紀yyyy) | 輸入/輸出 | 標准 |
- | 0 or 100 | mon dd yyyy hh:miAM(or PM) | Default |
1 | 101 | mm/dd/yy | USA |
2 | 102 | yy.mm.dd | ANSI |
3 | 103 | dd/mm/yy | British/French |
4 | 104 | dd.mm.yy | German |
5 | 105 | dd-mm-yy | ltalian |
6 | 106 | dd mon yy | |
7 | 107 | Mon dd,yy | |
8 | 108 | hh:mm:ss | |
- | 9 or 109 | mon dd yyyy hh:mi:ss:mmmAM(or PM) | Default+millisec |
10 | 110 | mm-dd-yy | USA |
11 | 111 | yy/mm/dd | Japan |
12 | 112 | yymmdd | ISO |
- | 13 or 113 | dd mon yyyy hh:mi:ss:mmm(24h) | |
14 | 114 | hh:mi:ss:mmm(24h) | |
- | 20 or 120 | yyyy-mm-dd hh:mi:ss(24h) | |
- | 21 or 121 | yyyy-mm-dd hh:mi:ss.mmm(24h) | |
- | 126 | yyyy-mm-ddThh:mi:ss.mmm(no spaces) | ISO8601 |
- | 130 | dd mon yyyy hh:mi:ss:mmmAM | Hijiri |
- | 131 | dd/mm/yy hh:mi:ss:mmmAM | Hijiri |
實例:
下面的腳本使用CONVERT()函數來顯示不同的格式。使用GETDATE()函數來獲取當前的日期/時間
CONVERT(VARCHAR(19),GETDATE()) CONVERT(VARCHAR(10),GETDATE(),10) CONVERT(VARCHAR(10),GETDATE(),110) CONVERT(VARCHAR(11),GETDATE(),6) CONVERT(VARCHAR(11),GETDATE(),106) CONVERT(VARCHAR(24),GETDATE(),113)
結果如下所示:
Nov 04 2011 11:45 PM 11-04-11 11-04-2011 04 Nov 11 04 Nov 2011 04 Nov 2011 11:45:34:243
PostgreSQL 時間/日期函數和操作符
在 postgre中一些特定的時間,數字可以進行基本操作符 加+ 減- 乘* 除/ 操作
日期/時間操作符
操作符 | 例子 | 結果 |
+ | select date '2019-10-18' +integer '7' | date '2019-10-25' |
+ | select date '2019-10-18' + interval '1 hour' | timestamp '2019-10-18 01:00:00' |
+ | select date '2019-10-18' + time '03:00' | timestamp '2019-10-18 03:00:00' |
+ | select interval '1 day' + interval '1 hour' | interval '1 day 01:00:00' |
+ | select timestamp '2019-10-18 01:00' + interval '23 hours' | timestamp '2019-10-19 00:00:00' |
+ | select time '01:00' + interval '3 hours' | time '04:00:00' |
- | - interval '23 hours' | interval -23:00:00 |
- | select date '2019-10-18' - date '2019-10-15' | intrger 3(days) |
- | select date '2019-10-18' - integer '7' | date '2019-10-11' |
- | date '2001-09-28' - interval '1 hour' | timestamp '2019-10-17 23:00:00' |
- | time '05:00' - time '03:00' | interval '02:00:00' |
- | time '05:00' - interval '2 hours' | time '03:00:00' |
- | select timestamp '2019-10-18 23:00' - interval '23 hours' | timestamp '2019-10-18 00:00:00' |
- | select interval '1 day' - interval '1 hour' | interval '1 day -01:00:00' |
- | timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' | interval '2 days 15:00:00' |
* | 900 * interval '1 second' | interval '00:15:00' |
* | select 21 * interval '1 day' | interval '21 days' |
* | select double precision '3.5' * interval '1 hour' | interval '03:30:00' |
/ | interval '1 hour' / double precision '1.5' | interval '00:40:00' |
日期/時間函數
函數 | 返回類型 | 描述 | 例子 | 結果 |
age(timestamp, timestamp) | interval | 減去參數后的"符號化"結果,使用年和月,不只是使用天 | select age(timestamp '2019-10-18', timestamp '1998-07-31') | "21 years 2 mons 18 days" |
age(timestamp) | interval | 從current_date 減去參數后的結果(在午夜) |
select age(timestamp '1998-07-31') | "21 years 2 mons 18 days" |
clock_timestamp() | timestamp with time zone | 實時時鍾的當前時間戳(在語句執行時變化) | select clock_timestamp() | "2019-10-18 21:47:03.880667+08" |
current_date | date | 當前的日期; | select current_date | "2019-10-18" |
current_time | time with time zone | 當前的時間; | select current_time | "21:50:35.168911+08:00" |
current_timestamp | timestamp with time zone | 當前事務開始時的時間戳; | select current_timestamp | "2019-10-18 21:49:17.912353+08" |
date_part(text, timestamp) | double precision | 獲取子域(等效於extract ); |
date_part('hour', timestamp '2001-02-16 20:38:40') | 22 |
date_part(text, interval) | double precision | 獲取子域(等效於extract ); |
date_part('month', interval '2 years 3 months') | 3 |
date_trunc(text, timestamp) | timestamp | 截斷成指定的精度; | select date_trunc('hour', timestamp '2019-10-18 22:55:40') | "2019-10-18 22:00:00" |
date_trunc(text, interval) | interval | 截取指定的精度, | date_trunc('hour', interval '2 days 3 hours 40 minutes') | "2 days 03:00:00" |
extract (field from timestamp) |
double precision | 獲取子域; | select extract(hour from timestamp '2019-10-18 22:58:40') | "22" |
extract (field from interval) |
double precision | 獲取子域; | select extract(month from interval '2 years 3 months') | "3" |
isfinite(date) | boolean | 測試是否為有窮日期(不是 +/-無窮) | select isfinite(date '2019-10-18') | true |
isfinite(timestamp) | boolean | 測試是否為有窮時間戳(不是 +/-無窮) | select isfinite(timestamp '2001-02-16 21:28:30') | true |
isfinite(interval) | boolean | 測試是否為有窮時間間隔 | select isfinite(interval '4 hours') | true |
justify_days(interval) | interval | 按照每月 30 天調整時間間隔 | select justify_days(interval '35 days') | "1 mon 5 days" |
justify_hours(interval) | interval | 按照每天 24 小時調整時間間隔 | select justify_hours(interval '27 hours') | "1 day 03:00:00" |
justify_interval(interval) | interval | 使用justify_days 和justify_hours 調整時間間隔的同時進行正負號調整 |
select justify_interval(interval '1 mon -1 hour') | "29 days 23:00:00" |
localtime | time | 當日時間; | select localtime | "22:29:47.906458" |
localtimestamp | timestamp | 當前事務開始時的時間戳; | select localtimestamp | "2019-10-18 22:30:51.573436" |
make_date(year int, month int, day int) | date | 為年、月和日字段創建日期 | make_date(2013, 7, 15) | 2013-07-15 |
now() | timestamp with time zone | 當前事務開始時的時間戳; | select now() | "2019-10-18 22:33:19.559465+08" |
statement_timestamp() | timestamp with time zone |
實時時鍾的當前時間戳; | statement_timestamp() | "2019-10-18 22:34:50.077578+08" |
timeofday() | text | 與clock_timestamp 相同,但結果是一個text 字符串; |
select timeofday() | "Fri Oct 18 22:35:41.196317 2019 HKT" |
transaction_timestamp() | timestamp with time zone | 當前事務開始時的時間戳; | select transaction_timestamp() | "2019-10-18 22:36:42.310184+08" |