第四十二章 SQL函数 DATEADD
文章目錄
- 第四十二章 SQL函數 DATEADD
- 大綱
- 參數
- 描述
- Datepart Argument
- 日期表達式格式
- 范圍和值檢查
第四十二章 SQL函數 DATEADD
一個日期/時間函數,它返回一個時間戳,計算方法是在一個日期或時間戳中添加或減去若干日期部件單位(如小時或天)。
大綱
DATEADD(datepart,integer-exp,date-exp)參數
- datepart - 日期或時間部分的名稱(或縮寫)。
可以用大寫或小寫指定該名稱,也可以不加引號。
可以將datepart指定為文字或主機變量。 - integer-exp - 任意數字類型的數字表達式。
該值被截斷為整數(正或負)。
該值指示將添加到(或從)date-exp中減去的datepart單元的數量。 - date-exp - 要修改的日期/時間表達式。它可以是日期字符串,也可以是時間戳字符串(%PosiTime或%Timestamp數據類型),也可以是CURRENT_DATE之類的函數。返回的值始終是時間戳,數據類型格式為%PosiTime或%Timestamp。
描述
DATEADD函數通過將指定的日期部分遞增指定的單元數來修改日期/時間表達式。
例如,如果datepart為“month”且整數-exp為5,則DATEADD將date-exp遞增5個月。
還可以通過為integer-exp指定一個負整數來減少日期部分。
計算出的日期將作為完整的日期/時間表達式(時間戳)返回。返回的數據類型取決于Date-EXP的數據類型。如果Date-EXP為%Library.PosiTime(編碼的64位有符號整數),則DATEADD返回數據類型%Library.PosiTime。否則,DATEADD返回數據類型%Library.TimeStamp(yyyy-mm-dd hh:mm:ss.fff)。
DATEADD始終返回有效日期,并考慮一個月的天數,并計算閏年。例如,將1月31日遞增一個月將返回2月28日(該月中的最高有效日期),除非指定的年份是閏年,在這種情況下將返回2月29日。將閏年日期2月29日遞增一年將返回2月28日。將閏年日期2月29日遞增四年返回2月29日。
如果指定包含小數秒的date-exp,則返回值也包括小數秒。如果省略date-exp的時間部分,DATEADD將返回默認時間00:00:00。如果省略date-exp的日期部分,DATEADD將返回默認日期1900-01-01。
DATEADD和TIMESTAMPADD處理季度(3個月間隔);DATEDIFF和TIMESTAMPDIFF不處理季度。
可以使用TIMESTAMPADD ODBC標量函數執行類似的時間/日期修改操作。
也可以使用DATEADD()方法調用從ObjectScript調用此函數:
$SYSTEM.SQL.Functions.DATEADD(datepart,integer-exp,date-exp)Datepart Argument
日期部分參數可以是以下日期/時間組件之一:全名(日期部分列)或其縮寫(縮寫列)。這些日期部分組件名稱和縮寫不區分大小寫。
| year | yyyy, yy | Increments year by 1. |
| quarter | qq, q | Increments month by 3. |
| month | mm, m | Increments month by 1. |
| week | wk, ww | Increments day by 7. |
| weekday | dw | Increments day by 1. |
| day | dd, d | Increments day by 1. |
| dayofyear | dy, y | Increments day by 1. |
| hour | hh | Increments hour by 1. |
| minute | mi, n | Increments minute by 1. |
| second | ss, s | Increments second by 1. |
| millisecond | ms | Increments by .001 of a second. |
| microsecond | mcs | 0–999999 (with precision of 6) |
| nanosecond | ns | 0–999999999 (with precision of 9) |
遞增或遞減日期部分會導致適當修改其他日期部分。例如,午夜過后的小時遞增會自動遞增日期,這又可能會遞增月份,依此類推。
日期部分可以指定為帶引號的字符串或不帶引號。這些語法變體執行的操作略有不同:
- QUOTES:DATEADD('month',12,$HOROLOG):在創建緩存查詢時,日期部分被視為文字。 SQL執行文字替換。這會產生更普遍可重用的緩存查詢。
- 無引號:DATEADD(MONTH,12,$HOROLOG):在創建緩存查詢時,日期部分被視為關鍵字。沒有文字替換。這會產生更具體的緩存查詢。
如果將無效的日期部分值指定為文字,則會發出SQLCODE-8錯誤代碼。但是,如果提供無效的日期部件值作為主機變量,則不會發出SQLCODE錯誤,并且DATEPART函數返回值為NULL。
日期表達式格式
Date-exp參數可以采用以下任何格式,并且可以包括或省略小數秒:
-
%Date logical value (+$H)
-
%PosiTime(%Library.PosiTime)邏輯值(編碼的64位有符號整數)
-
(%Library.TimeStamp)邏輯值(YYYY-MM-DD HH:MM:SS)
-
%String(或兼容)值
%STRING(或COMPATIBLE)值可以采用以下任何格式:
-
99999,99999 ($H format)
-
/SQL-Server-date Sybase/SQL-Server-time
-
Sybase/SQL-Server-time Sybase/SQL-Server-date
-
Sybase/SQL-Server-date (default time is 00:00:00)
-
Sybase/SQL-Server-time (default date is 01/01/1900)
Sybase/SQL-Server-Date是以下五種格式之一:
mmdelimiterdddelimiter[yy]yy dd Mmm[mm][,][yy]yy dd [yy]yy Mmm[mm] yyyy Mmm[mm] dd yyyy [dd] Mmm[mm]其中,分隔符是斜杠(/)、連字符(-)或句點(.)。
Sybase/SQL-Server-Time表示以下三種格式之一:
HH:MM[:SS:SSS][{AM|PM}] HH:MM[:SS.S] HH['']{AM|PM}請注意,提供DATEADD是為了與Sybase和Microsoft SQL Server兼容。
范圍和值檢查
DATEADD對輸入值執行以下檢查。如果值未通過檢查,則返回空字符串。
- 日期字符串必須完整且格式正確,包含適當數量的元素和每個元素的數字,以及適當的分隔符。年份必須指定為四位數。
- 日期值必須在有效范圍內。年份:0001到9999。月份:1到12天:1到31。時間:0點到23點。分鐘:0到59分鐘。秒:0到59。
- 返回的遞增的year值必須在0001到9999之間。
超出此范圍將返回<null>。 - 一個月中的天數必須與月和年相匹配。
例如,日期“02-29”僅在指定的年份為閏年時有效。 - 小于10的日期值可以包括或省略前導零。
不允許使用其他非規范整數值。
因此,Day值為“07”或“7”是有效的,但“007”、“7.0”或“7a”無效。
下面的例子為指定的日期添加了1周:
SELECT DATEADD('week',1,'2018-02-26') AS NewDate2018/3/5 0:00:00它返回2018-03-05 00:00:00,因為增加1周會增加7天。
注意,DATEADD提供了省略的時間部分。
下面的例子為時間戳添加了5個月:
SELECT DATEADD(MM,5,'2017-11-26 12:00:00') AS NewDate2018/4/26 12:00:00它返回2018-04-26 12:00:00,因為增加5個月也會增加一年。
下面的例子也在時間戳上增加了5個月:
SELECT DATEADD('mm',5,'2018-01-31 12:00:00') AS NewDate2018/6/30 12:00:00它返回2018-06-30 12:00:00。
這里DATEADD修改了日值和月值,因為簡單地增加月值將導致6月31日,這是一個無效的日期。
下面的例子為時間戳添加了45分鐘:
SELECT DATEADD(MI,45,'2018-02-26 12:00:00') AS NewTime2018/2/26 12:45:00下面的示例還為時間戳添加了45分鐘,但在本例中,添加的內容增加了日,從而增加了月:
SELECT DATEADD('mi',45,'2018-02-28 23:30:00') AS NewTime2018/3/1 0:15:00下面的例子將原始時間戳減去45分鐘:
SELECT DATEADD(N,-45,'2018-01-01 00:10:00') AS NewTime2017/12/31 23:25:00下面的例子為當前日期添加了60天,并根據月份的不同長度進行調整:
SELECT DATEADD(D,60,CURRENT_DATE) AS NewDate2022/4/4 0:00:00在下面的例子中,第一個DATEADD為指定的日期添加了92天,第二個DATEADD為指定的日期添加了1 / 4天:
SELECT DATEADD('dd',92,'2018-12-20') AS NewDateD,DATEADD('qq',1,'2018-12-20') AS NewDateQ第一季將于2019-03-22 00:00:00回歸;
第二季將于2019-03-20 00:00:00回歸。
每增加1 / 4,month字段就會增加3,如果需要,還會增加year字段。
它還校正給定月份的最大天數。
上面的例子都使用日期部分的縮寫。
但是,也可以用它的全名來指定日期部分,就像下面的例子一樣:
下面的嵌入式SQL示例使用主機變量來執行與前面示例相同的DATEADD操作:
ClassMethod DateAdd() {s x="day"s datein="2019-12-20"&sql(SELECT DATEADD(:x,92,:datein)INTO :dateout)w "in: ",datein,!,"out: ",dateout } DHC-APP>d ##class(PHA.TEST.SQLCommand).DateAdd() in: 2019-12-20 out: 2020-03-21 00:00:00 DHC-APP>總結
以上是生活随笔為你收集整理的第四十二章 SQL函数 DATEADD的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows常用端口对应表
- 下一篇: linux cmake编译源码,linu