date-time.asciidoc 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640
  1. [role="xpack"]
  2. [testenv="basic"]
  3. [[sql-functions-datetime]]
  4. === Date/Time and Interval Functions and Operators
  5. {es-sql} offers a wide range of facilities for performing date/time manipulations.
  6. [[sql-functions-datetime-interval]]
  7. ==== Intervals
  8. A common requirement when dealing with date/time in general revolves around
  9. the notion of `interval`, a topic that is worth exploring in the context of {es} and {es-sql}.
  10. {es} has comprehensive support for <<date-math, date math>> both inside <<date-math-index-names, index names>> and <<mapping-date-format, queries>>.
  11. Inside {es-sql} the former is supported as is by passing the expression in the table name, while the latter is supported through the standard SQL `INTERVAL`.
  12. The table below shows the mapping between {es} and {es-sql}:
  13. [cols="^m,^m"]
  14. |==========================
  15. s|{es}
  16. s|{es-sql}
  17. 2+h| Index/Table datetime math
  18. 2+|<index-{now/M{YYYY.MM}}>
  19. 2+h| Query date/time math
  20. | 1y | INTERVAL 1 YEAR
  21. | 2M | INTERVAL 2 MONTH
  22. | 3w | INTERVAL 21 DAY
  23. | 4d | INTERVAL 4 DAY
  24. | 5h | INTERVAL 5 HOUR
  25. | 6m | INTERVAL 6 MINUTE
  26. | 7s | INTERVAL 7 SECOND
  27. |==========================
  28. `INTERVAL` allows either `YEAR` and `MONTH` to be mixed together _or_ `DAY`, `HOUR`, `MINUTE` and `SECOND`.
  29. TIP: {es-sql} accepts also the plural for each time unit (e.g. both `YEAR` and `YEARS` are valid).
  30. Example of the possible combinations below:
  31. [cols="^,^"]
  32. |===
  33. s|Interval
  34. s|Description
  35. | `INTERVAL '1-2' YEAR TO MONTH` | 1 year and 2 months
  36. | `INTERVAL '3 4' DAYS TO HOURS` | 3 days and 4 hours
  37. | `INTERVAL '5 6:12' DAYS TO MINUTES` | 5 days, 6 hours and 12 minutes
  38. | `INTERVAL '3 4:56:01' DAY TO SECOND` | 3 days, 4 hours, 56 minutes and 1 second
  39. | `INTERVAL '2 3:45:01.23456789' DAY TO SECOND` | 2 days, 3 hours, 45 minutes, 1 second and 234567890 nanoseconds
  40. | `INTERVAL '123:45' HOUR TO MINUTES` | 123 hours and 45 minutes
  41. | `INTERVAL '65:43:21.0123' HOUR TO SECONDS` | 65 hours, 43 minutes, 21 seconds and 12300000 nanoseconds
  42. | `INTERVAL '45:01.23' MINUTES TO SECONDS` | 45 minutes, 1 second and 230000000 nanoseconds
  43. |===
  44. ==== Operators
  45. Basic arithmetic operators (`+`, `-`, etc) support date/time parameters as indicated below:
  46. ["source","sql",subs="attributes,callouts,macros"]
  47. --------------------------------------------------
  48. include-tagged::{sql-specs}/docs.csv-spec[dtIntervalPlusInterval]
  49. --------------------------------------------------
  50. ["source","sql",subs="attributes,callouts,macros"]
  51. --------------------------------------------------
  52. include-tagged::{sql-specs}/docs.csv-spec[dtDateTimePlusInterval]
  53. --------------------------------------------------
  54. ["source","sql",subs="attributes,callouts,macros"]
  55. --------------------------------------------------
  56. include-tagged::{sql-specs}/docs.csv-spec[dtMinusInterval]
  57. --------------------------------------------------
  58. ["source","sql",subs="attributes,callouts,macros"]
  59. --------------------------------------------------
  60. include-tagged::{sql-specs}/docs.csv-spec[dtIntervalMinusInterval]
  61. --------------------------------------------------
  62. ["source","sql",subs="attributes,callouts,macros"]
  63. --------------------------------------------------
  64. include-tagged::{sql-specs}/docs.csv-spec[dtDateTimeMinusInterval]
  65. --------------------------------------------------
  66. ["source","sql",subs="attributes,callouts,macros"]
  67. --------------------------------------------------
  68. include-tagged::{sql-specs}/docs.csv-spec[dtIntervalMul]
  69. --------------------------------------------------
  70. ==== Functions
  71. Functions that target date/time.
  72. [[sql-functions-current-date]]
  73. ==== `CURRENT_DATE/CURDATE`
  74. .Synopsis:
  75. [source, sql]
  76. --------------------------------------------------
  77. CURRENT_DATE
  78. CURRENT_DATE()
  79. --------------------------------------------------
  80. *Input*: _none_
  81. *Output*: date
  82. .Description:
  83. Returns the date (no time part) when the current query reached the server.
  84. It can be used both as a keyword: `CURRENT_DATE` or as a function with no arguments: `CURRENT_DATE()`.
  85. [NOTE]
  86. Unlike CURRENT_DATE, `CURDATE()` can only be used as a function with no arguments and not as a keyword.
  87. This method always returns the same value for its every occurrence within the same query.
  88. ["source","sql",subs="attributes,callouts,macros"]
  89. --------------------------------------------------
  90. include-tagged::{sql-specs}/docs.csv-spec[curDate]
  91. --------------------------------------------------
  92. ["source","sql",subs="attributes,callouts,macros"]
  93. --------------------------------------------------
  94. include-tagged::{sql-specs}/docs.csv-spec[curDateFunction]
  95. --------------------------------------------------
  96. Typically, this function (as well as its twin <<sql-functions-today,TODAY())>> function
  97. is used for relative date filtering:
  98. ["source","sql",subs="attributes,callouts,macros"]
  99. --------------------------------------------------
  100. include-tagged::{sql-specs}/docs.csv-spec[filterToday]
  101. --------------------------------------------------
  102. [[sql-functions-current-timestamp]]
  103. ==== `CURRENT_TIMESTAMP`
  104. .Synopsis:
  105. [source, sql]
  106. --------------------------------------------------
  107. CURRENT_TIMESTAMP
  108. CURRENT_TIMESTAMP(precision <1>)
  109. --------------------------------------------------
  110. *Input*:
  111. <1> fractional digits; optional
  112. *Output*: date/time
  113. .Description:
  114. Returns the date/time when the current query reached the server.
  115. As a function, `CURRENT_TIMESTAMP()` accepts _precision_ as an optional
  116. parameter for rounding the second fractional digits (nanoseconds).
  117. This method always returns the same value for its every occurrence within the same query.
  118. ["source","sql",subs="attributes,callouts,macros"]
  119. --------------------------------------------------
  120. include-tagged::{sql-specs}/docs.csv-spec[curTs]
  121. --------------------------------------------------
  122. ["source","sql",subs="attributes,callouts,macros"]
  123. --------------------------------------------------
  124. include-tagged::{sql-specs}/docs.csv-spec[curTsFunction]
  125. --------------------------------------------------
  126. ["source","sql",subs="attributes,callouts,macros"]
  127. --------------------------------------------------
  128. include-tagged::{sql-specs}/docs.csv-spec[curTsFunctionPrecision]
  129. --------------------------------------------------
  130. Typically, this function (as well as its twin <<sql-functions-now,NOW())>> function is used for
  131. relative date/time filtering:
  132. ["source","sql",subs="attributes,callouts,macros"]
  133. --------------------------------------------------
  134. include-tagged::{sql-specs}/docs.csv-spec[filterNow]
  135. --------------------------------------------------
  136. [[sql-functions-datetime-day]]
  137. ==== `DAY_OF_MONTH/DOM/DAY`
  138. .Synopsis:
  139. [source, sql]
  140. --------------------------------------------------
  141. DAY_OF_MONTH(datetime_exp<1>)
  142. --------------------------------------------------
  143. *Input*:
  144. <1> date/datetime expression
  145. *Output*: integer
  146. .Description:
  147. Extract the day of the month from a date/datetime.
  148. ["source","sql",subs="attributes,callouts,macros"]
  149. --------------------------------------------------
  150. include-tagged::{sql-specs}/docs.csv-spec[dayOfMonth]
  151. --------------------------------------------------
  152. [[sql-functions-datetime-dow]]
  153. ==== `DAY_OF_WEEK/DAYOFWEEK/DOW`
  154. .Synopsis:
  155. [source, sql]
  156. --------------------------------------------------
  157. DAY_OF_WEEK(datetime_exp<1>)
  158. --------------------------------------------------
  159. *Input*:
  160. <1> date/datetime expression
  161. *Output*: integer
  162. .Description:
  163. Extract the day of the week from a date/datetime. Sunday is `1`, Monday is `2`, etc.
  164. ["source","sql",subs="attributes,callouts,macros"]
  165. --------------------------------------------------
  166. include-tagged::{sql-specs}/docs.csv-spec[dayOfWeek]
  167. --------------------------------------------------
  168. [[sql-functions-datetime-doy]]
  169. ==== `DAY_OF_YEAR/DOY`
  170. .Synopsis:
  171. [source, sql]
  172. --------------------------------------------------
  173. DAY_OF_YEAR(datetime_exp<1>)
  174. --------------------------------------------------
  175. *Input*:
  176. <1> date/datetime expression
  177. *Output*: integer
  178. .Description:
  179. Extract the day of the year from a date/datetime.
  180. ["source","sql",subs="attributes,callouts,macros"]
  181. --------------------------------------------------
  182. include-tagged::{sql-specs}/docs.csv-spec[dayOfYear]
  183. --------------------------------------------------
  184. [[sql-functions-datetime-dayname]]
  185. ==== `DAY_NAME/DAYNAME`
  186. .Synopsis:
  187. [source, sql]
  188. --------------------------------------------------
  189. DAY_NAME(datetime_exp<1>)
  190. --------------------------------------------------
  191. *Input*:
  192. <1> date/datetime expression
  193. *Output*: string
  194. .Description:
  195. Extract the day of the week from a date/datetime in text format (`Monday`, `Tuesday`...).
  196. ["source","sql",subs="attributes,callouts,macros"]
  197. --------------------------------------------------
  198. include-tagged::{sql-specs}/docs.csv-spec[dayName]
  199. --------------------------------------------------
  200. [[sql-functions-datetime-hour]]
  201. ==== `HOUR_OF_DAY/HOUR`
  202. .Synopsis:
  203. [source, sql]
  204. --------------------------------------------------
  205. HOUR_OF_DAY(datetime_exp<1>)
  206. --------------------------------------------------
  207. *Input*:
  208. <1> date/datetime expression
  209. *Output*: integer
  210. .Description:
  211. Extract the hour of the day from a date/datetime.
  212. ["source","sql",subs="attributes,callouts,macros"]
  213. --------------------------------------------------
  214. include-tagged::{sql-specs}/docs.csv-spec[hourOfDay]
  215. --------------------------------------------------
  216. [[sql-functions-datetime-isodow]]
  217. ==== `ISO_DAY_OF_WEEK/ISODAYOFWEEK/ISODOW/IDOW`
  218. .Synopsis:
  219. [source, sql]
  220. --------------------------------------------------
  221. ISO_DAY_OF_WEEK(datetime_exp<1>)
  222. --------------------------------------------------
  223. *Input*:
  224. <1> date/datetime expression
  225. *Output*: integer
  226. .Description:
  227. Extract the day of the week from a date/datetime, following the https://en.wikipedia.org/wiki/ISO_week_date[ISO 8601 standard].
  228. Monday is `1`, Tuesday is `2`, etc.
  229. ["source","sql",subs="attributes,callouts,macros"]
  230. --------------------------------------------------
  231. include-tagged::{sql-specs}/docs.csv-spec[isoDayOfWeek]
  232. --------------------------------------------------
  233. [[sql-functions-datetime-isoweek]]
  234. ==== `ISO_WEEK_OF_YEAR/ISOWEEKOFYEAR/ISOWEEK/IWOY/IW`
  235. .Synopsis:
  236. [source, sql]
  237. --------------------------------------------------
  238. ISO_WEEK_OF_YEAR(datetime_exp<1>)
  239. --------------------------------------------------
  240. *Input*:
  241. <1> date/datetime expression
  242. *Output*: integer
  243. .Description:
  244. Extract the week of the year from a date/datetime, following https://en.wikipedia.org/wiki/ISO_week_date[ISO 8601 standard]. The first week
  245. of a year is the first week with a majority (4 or more) of its days in January.
  246. ["source","sql",subs="attributes,callouts,macros"]
  247. --------------------------------------------------
  248. include-tagged::{sql-specs}/docs.csv-spec[isoWeekOfYear]
  249. --------------------------------------------------
  250. [[sql-functions-datetime-minuteofday]]
  251. ==== `MINUTE_OF_DAY`
  252. .Synopsis:
  253. [source, sql]
  254. --------------------------------------------------
  255. MINUTE_OF_DAY(datetime_exp<1>)
  256. --------------------------------------------------
  257. *Input*:
  258. <1> date/datetime expression
  259. *Output*: integer
  260. .Description:
  261. Extract the minute of the day from a date/datetime.
  262. ["source","sql",subs="attributes,callouts,macros"]
  263. --------------------------------------------------
  264. include-tagged::{sql-specs}/docs.csv-spec[minuteOfDay]
  265. --------------------------------------------------
  266. [[sql-functions-datetime-minute]]
  267. ==== `MINUTE_OF_HOUR/MINUTE`
  268. .Synopsis:
  269. [source, sql]
  270. --------------------------------------------------
  271. MINUTE_OF_HOUR(datetime_exp<1>)
  272. --------------------------------------------------
  273. *Input*:
  274. <1> date/datetime expression
  275. *Output*: integer
  276. .Description:
  277. Extract the minute of the hour from a date/datetime.
  278. ["source","sql",subs="attributes,callouts,macros"]
  279. --------------------------------------------------
  280. include-tagged::{sql-specs}/docs.csv-spec[minuteOfHour]
  281. --------------------------------------------------
  282. [[sql-functions-datetime-month]]
  283. ==== `MONTH_OF_YEAR/MONTH`
  284. .Synopsis:
  285. [source, sql]
  286. --------------------------------------------------
  287. MONTH(datetime_exp<1>)
  288. --------------------------------------------------
  289. *Input*:
  290. <1> date/datetime expression
  291. *Output*: integer
  292. .Description:
  293. Extract the month of the year from a date/datetime.
  294. ["source","sql",subs="attributes,callouts,macros"]
  295. --------------------------------------------------
  296. include-tagged::{sql-specs}/docs.csv-spec[monthOfYear]
  297. --------------------------------------------------
  298. [[sql-functions-datetime-monthname]]
  299. ==== `MONTH_NAME/MONTHNAME`
  300. .Synopsis:
  301. [source, sql]
  302. --------------------------------------------------
  303. MONTH_NAME(datetime_exp<1>)
  304. --------------------------------------------------
  305. *Input*:
  306. <1> date/datetime expression
  307. *Output*: string
  308. .Description:
  309. Extract the month from a date/datetime in text format (`January`, `February`...).
  310. ["source","sql",subs="attributes,callouts,macros"]
  311. --------------------------------------------------
  312. include-tagged::{sql-specs}/docs.csv-spec[monthName]
  313. --------------------------------------------------
  314. [[sql-functions-now]]
  315. ==== `NOW`
  316. .Synopsis:
  317. [source, sql]
  318. --------------------------------------------------
  319. NOW()
  320. --------------------------------------------------
  321. *Input*: _none_
  322. *Output*: datetime
  323. .Description:
  324. This function offers the same functionality as <<sql-functions-current-timestamp,CURRENT_TIMESTAMP()>> function: returns
  325. the datetime when the current query reached the server. This method always returns the same value for its every
  326. occurrence within the same query.
  327. ["source","sql",subs="attributes,callouts,macros"]
  328. --------------------------------------------------
  329. include-tagged::{sql-specs}/docs.csv-spec[nowFunction]
  330. --------------------------------------------------
  331. Typically, this function (as well as its twin <<sql-functions-current-timestamp,CURRENT_TIMESTAMP())>> function is used
  332. for relative date/time filtering:
  333. ["source","sql",subs="attributes,callouts,macros"]
  334. --------------------------------------------------
  335. include-tagged::{sql-specs}/docs.csv-spec[filterNow]
  336. --------------------------------------------------
  337. [[sql-functions-datetime-second]]
  338. ==== `SECOND_OF_MINUTE/SECOND`
  339. .Synopsis:
  340. [source, sql]
  341. --------------------------------------------------
  342. SECOND_OF_MINUTE(datetime_exp<1>)
  343. --------------------------------------------------
  344. *Input*:
  345. <1> date/datetime expression
  346. *Output*: integer
  347. .Description:
  348. Extract the second of the minute from a date/datetime.
  349. ["source","sql",subs="attributes,callouts,macros"]
  350. --------------------------------------------------
  351. include-tagged::{sql-specs}/docs.csv-spec[secondOfMinute]
  352. --------------------------------------------------
  353. [[sql-functions-datetime-quarter]]
  354. ==== `QUARTER`
  355. .Synopsis:
  356. [source, sql]
  357. --------------------------------------------------
  358. QUARTER(datetime_exp<1>)
  359. --------------------------------------------------
  360. *Input*:
  361. <1> date/datetime expression
  362. *Output*: integer
  363. .Description:
  364. Extract the year quarter the date/datetime falls in.
  365. ["source","sql",subs="attributes,callouts,macros"]
  366. --------------------------------------------------
  367. include-tagged::{sql-specs}/docs.csv-spec[quarter]
  368. --------------------------------------------------
  369. [[sql-functions-today]]
  370. ==== `TODAY`
  371. .Synopsis:
  372. [source, sql]
  373. --------------------------------------------------
  374. TODAY()
  375. --------------------------------------------------
  376. *Input*: _none_
  377. *Output*: date
  378. .Description:
  379. This function offers the same functionality as <<sql-functions-current-date,CURRENT_DATE()>> function: returns
  380. the date when the current query reached the server. This method always returns the same value for its every occurrence
  381. within the same query.
  382. ["source","sql",subs="attributes,callouts,macros"]
  383. --------------------------------------------------
  384. include-tagged::{sql-specs}/docs.csv-spec[todayFunction]
  385. --------------------------------------------------
  386. Typically, this function (as well as its twin <<sql-functions-current-timestamp,CURRENT_TIMESTAMP())>> function is used
  387. for relative date filtering:
  388. ["source","sql",subs="attributes,callouts,macros"]
  389. --------------------------------------------------
  390. include-tagged::{sql-specs}/docs.csv-spec[filterToday]
  391. --------------------------------------------------
  392. [[sql-functions-datetime-week]]
  393. ==== `WEEK_OF_YEAR/WEEK`
  394. .Synopsis:
  395. [source, sql]
  396. --------------------------------------------------
  397. WEEK_OF_YEAR(datetime_exp<1>)
  398. --------------------------------------------------
  399. *Input*:
  400. <1> date/datetime expression
  401. *Output*: integer
  402. .Description:
  403. Extract the week of the year from a date/datetime.
  404. ["source","sql",subs="attributes,callouts,macros"]
  405. --------------------------------------------------
  406. include-tagged::{sql-specs}/docs.csv-spec[weekOfYear]
  407. --------------------------------------------------
  408. [[sql-functions-datetime-year]]
  409. ==== `YEAR`
  410. .Synopsis:
  411. [source, sql]
  412. --------------------------------------------------
  413. YEAR(datetime_exp<1>)
  414. --------------------------------------------------
  415. *Input*:
  416. <1> date/datetime expression
  417. *Output*: integer
  418. .Description:
  419. Extract the year from a date/datetime.
  420. ["source","sql",subs="attributes,callouts,macros"]
  421. --------------------------------------------------
  422. include-tagged::{sql-specs}/docs.csv-spec[year]
  423. --------------------------------------------------
  424. [[sql-functions-datetime-extract]]
  425. ==== `EXTRACT`
  426. .Synopsis:
  427. [source, sql]
  428. --------------------------------------------------
  429. EXTRACT(datetime_function<1> FROM datetime_exp<2>)
  430. --------------------------------------------------
  431. *Input*:
  432. <1> date/time function name
  433. <2> date/datetime expression
  434. *Output*: integer
  435. .Description:
  436. Extract fields from a date/datetime by specifying the name of a <<sql-functions-datetime,datetime function>>.
  437. The following
  438. ["source","sql",subs="attributes,callouts,macros"]
  439. --------------------------------------------------
  440. include-tagged::{sql-specs}/docs.csv-spec[extractDayOfYear]
  441. --------------------------------------------------
  442. is the equivalent to
  443. ["source","sql",subs="attributes,callouts,macros"]
  444. --------------------------------------------------
  445. include-tagged::{sql-specs}/docs.csv-spec[dayOfYear]
  446. --------------------------------------------------