第四十二章 SQL函数 DATEADD
文章目錄
- 第四十二章 SQL函數(shù) DATEADD
- 大綱
- 參數(shù)
- 描述
- Datepart Argument
- 日期表達(dá)式格式
- 范圍和值檢查
第四十二章 SQL函數(shù) DATEADD
一個(gè)日期/時(shí)間函數(shù),它返回一個(gè)時(shí)間戳,計(jì)算方法是在一個(gè)日期或時(shí)間戳中添加或減去若干日期部件單位(如小時(shí)或天)。
大綱
DATEADD(datepart,integer-exp,date-exp)參數(shù)
- datepart - 日期或時(shí)間部分的名稱(或縮寫)。
可以用大寫或小寫指定該名稱,也可以不加引號。
可以將datepart指定為文字或主機(jī)變量。 - integer-exp - 任意數(shù)字類型的數(shù)字表達(dá)式。
該值被截?cái)酁檎麛?shù)(正或負(fù))。
該值指示將添加到(或從)date-exp中減去的datepart單元的數(shù)量。 - date-exp - 要修改的日期/時(shí)間表達(dá)式。它可以是日期字符串,也可以是時(shí)間戳字符串(%PosiTime或%Timestamp數(shù)據(jù)類型),也可以是CURRENT_DATE之類的函數(shù)。返回的值始終是時(shí)間戳,數(shù)據(jù)類型格式為%PosiTime或%Timestamp。
描述
DATEADD函數(shù)通過將指定的日期部分遞增指定的單元數(shù)來修改日期/時(shí)間表達(dá)式。
例如,如果datepart為“month”且整數(shù)-exp為5,則DATEADD將date-exp遞增5個(gè)月。
還可以通過為integer-exp指定一個(gè)負(fù)整數(shù)來減少日期部分。
計(jì)算出的日期將作為完整的日期/時(shí)間表達(dá)式(時(shí)間戳)返回。返回的數(shù)據(jù)類型取決于Date-EXP的數(shù)據(jù)類型。如果Date-EXP為%Library.PosiTime(編碼的64位有符號整數(shù)),則DATEADD返回?cái)?shù)據(jù)類型%Library.PosiTime。否則,DATEADD返回?cái)?shù)據(jù)類型%Library.TimeStamp(yyyy-mm-dd hh:mm:ss.fff)。
DATEADD始終返回有效日期,并考慮一個(gè)月的天數(shù),并計(jì)算閏年。例如,將1月31日遞增一個(gè)月將返回2月28日(該月中的最高有效日期),除非指定的年份是閏年,在這種情況下將返回2月29日。將閏年日期2月29日遞增一年將返回2月28日。將閏年日期2月29日遞增四年返回2月29日。
如果指定包含小數(shù)秒的date-exp,則返回值也包括小數(shù)秒。如果省略date-exp的時(shí)間部分,DATEADD將返回默認(rèn)時(shí)間00:00:00。如果省略date-exp的日期部分,DATEADD將返回默認(rèn)日期1900-01-01。
DATEADD和TIMESTAMPADD處理季度(3個(gè)月間隔);DATEDIFF和TIMESTAMPDIFF不處理季度。
可以使用TIMESTAMPADD ODBC標(biāo)量函數(shù)執(zhí)行類似的時(shí)間/日期修改操作。
也可以使用DATEADD()方法調(diào)用從ObjectScript調(diào)用此函數(shù):
$SYSTEM.SQL.Functions.DATEADD(datepart,integer-exp,date-exp)Datepart Argument
日期部分參數(shù)可以是以下日期/時(shí)間組件之一:全名(日期部分列)或其縮寫(縮寫列)。這些日期部分組件名稱和縮寫不區(qū)分大小寫。
| 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) |
遞增或遞減日期部分會(huì)導(dǎo)致適當(dāng)修改其他日期部分。例如,午夜過后的小時(shí)遞增會(huì)自動(dòng)遞增日期,這又可能會(huì)遞增月份,依此類推。
日期部分可以指定為帶引號的字符串或不帶引號。這些語法變體執(zhí)行的操作略有不同:
- QUOTES:DATEADD('month',12,$HOROLOG):在創(chuàng)建緩存查詢時(shí),日期部分被視為文字。 SQL執(zhí)行文字替換。這會(huì)產(chǎn)生更普遍可重用的緩存查詢。
- 無引號:DATEADD(MONTH,12,$HOROLOG):在創(chuàng)建緩存查詢時(shí),日期部分被視為關(guān)鍵字。沒有文字替換。這會(huì)產(chǎn)生更具體的緩存查詢。
如果將無效的日期部分值指定為文字,則會(huì)發(fā)出SQLCODE-8錯(cuò)誤代碼。但是,如果提供無效的日期部件值作為主機(jī)變量,則不會(huì)發(fā)出SQLCODE錯(cuò)誤,并且DATEPART函數(shù)返回值為NULL。
日期表達(dá)式格式
Date-exp參數(shù)可以采用以下任何格式,并且可以包括或省略小數(shù)秒:
-
%Date logical value (+$H)
-
%PosiTime(%Library.PosiTime)邏輯值(編碼的64位有符號整數(shù))
-
(%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]其中,分隔符是斜杠(/)、連字符(-)或句點(diǎn)(.)。
Sybase/SQL-Server-Time表示以下三種格式之一:
HH:MM[:SS:SSS][{AM|PM}] HH:MM[:SS.S] HH['']{AM|PM}請注意,提供DATEADD是為了與Sybase和Microsoft SQL Server兼容。
范圍和值檢查
DATEADD對輸入值執(zhí)行以下檢查。如果值未通過檢查,則返回空字符串。
- 日期字符串必須完整且格式正確,包含適當(dāng)數(shù)量的元素和每個(gè)元素的數(shù)字,以及適當(dāng)?shù)姆指舴D攴荼仨氈付樗奈粩?shù)。
- 日期值必須在有效范圍內(nèi)。年份:0001到9999。月份:1到12天:1到31。時(shí)間:0點(diǎn)到23點(diǎn)。分鐘:0到59分鐘。秒:0到59。
- 返回的遞增的year值必須在0001到9999之間。
超出此范圍將返回<null>。 - 一個(gè)月中的天數(shù)必須與月和年相匹配。
例如,日期“02-29”僅在指定的年份為閏年時(shí)有效。 - 小于10的日期值可以包括或省略前導(dǎo)零。
不允許使用其他非規(guī)范整數(shù)值。
因此,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,因?yàn)樵黾?周會(huì)增加7天。
注意,DATEADD提供了省略的時(shí)間部分。
下面的例子為時(shí)間戳添加了5個(gè)月:
SELECT DATEADD(MM,5,'2017-11-26 12:00:00') AS NewDate2018/4/26 12:00:00它返回2018-04-26 12:00:00,因?yàn)樵黾?個(gè)月也會(huì)增加一年。
下面的例子也在時(shí)間戳上增加了5個(gè)月:
SELECT DATEADD('mm',5,'2018-01-31 12:00:00') AS NewDate2018/6/30 12:00:00它返回2018-06-30 12:00:00。
這里DATEADD修改了日值和月值,因?yàn)楹唵蔚卦黾釉轮祵?dǎo)致6月31日,這是一個(gè)無效的日期。
下面的例子為時(shí)間戳添加了45分鐘:
SELECT DATEADD(MI,45,'2018-02-26 12:00:00') AS NewTime2018/2/26 12:45:00下面的示例還為時(shí)間戳添加了45分鐘,但在本例中,添加的內(nèi)容增加了日,從而增加了月:
SELECT DATEADD('mi',45,'2018-02-28 23:30:00') AS NewTime2018/3/1 0:15:00下面的例子將原始時(shí)間戳減去45分鐘:
SELECT DATEADD(N,-45,'2018-01-01 00:10:00') AS NewTime2017/12/31 23:25:00下面的例子為當(dāng)前日期添加了60天,并根據(jù)月份的不同長度進(jìn)行調(diào)整:
SELECT DATEADD(D,60,CURRENT_DATE) AS NewDate2022/4/4 0:00:00在下面的例子中,第一個(gè)DATEADD為指定的日期添加了92天,第二個(gè)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字段就會(huì)增加3,如果需要,還會(huì)增加year字段。
它還校正給定月份的最大天數(shù)。
上面的例子都使用日期部分的縮寫。
但是,也可以用它的全名來指定日期部分,就像下面的例子一樣:
下面的嵌入式SQL示例使用主機(jī)變量來執(zhí)行與前面示例相同的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>總結(jié)
以上是生活随笔為你收集整理的第四十二章 SQL函数 DATEADD的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows常用端口对应表
- 下一篇: mysql unzip下载_zip u