2020年6月18日 星期四

[日期函數]取得日期資料部分資訊

取得日期資料的部分日期資訊,如年、月、日及其他資訊。

指令說明:
ORACLE
ORACLE所提供的TO_CHAR轉換函數,可針對各種時間格式及NLS_LANGUAGE設定提供日期部分資訊,另外還有EXTRACT函數,將依資料型態不同提供不同日期資料中部位資料進擷取,如 date則擷取年月日資訊,而timestamp則尚可額外擷取時分秒等,另外也支援interval資料型態的擷取。語法整理如下:
語法
說明
TO_CHAR(date [, 'format' [, nls_language]])
傳回指定格式日期資料
EXTRACT(
{
{YEAR|MONTH|DAY|HOUR|MINUTE|SECOND}
| {TIMEZONE_HOUR|TIMEZONE_MINUTE}
| {TIMEZONE_REGION | TIMEZONE_ABBR}
}
FROM {date_value|interval_value}
)
: EXTRACT支援TIMEZONE功能。
傳回指定格式日期資料(依型態略不同)
-   date型態可擷取年月日
-   timestamp型態(包含t1-t2時間差) 可擷取年月日時分秒
-   interval型態可擷取特定部分

TO_CHAR轉換函數的使用方法,請參考格式轉換函數(日期/文字)。以下將取得系統時間的月份進行比較說明。SQL語法如下:
範例:
ALTER SESSION SET NLS_LANGUAGE  = 'TRADITIONAL CHINESE';
-- 切換為中文
SELECT SYSDATE
--(0) 2020-06-18
   , EXTRACT(MONTH FROM SYSDATE)
--(1) 6
   , TO_CHAR(SYSDATE, 'MM')
--(2) 06
   , TO_CHAR(SYSDATE, 'Month')
--(3) 6
   , TO_CHAR(SYSDATE, 'FMMonth'   
, 'NLS_DATE_LANGUAGE=American')
--(4)如省略FM則顥示[June…..],字尾會以空白補足9
   -----------------

   , EXTRACT(second FROM systimestamp) Sec
--(5) 取得秒, 19
FROM DUAL

由於先以ALTER SEESION切換為中文模式,TO_CHAR(SYSDATE, 'Month')將依NLS設定顯示為中文。而於函數中增加NLS_DATE_LANGUAGE=American' 則依設定以顯示英文月份,但請注意預設將字尾以空白字元補足9碼,如欲剔除空白需指定Fm(填充模式)參數。查詢V$NLS_PARAMETERS以確知各項設定:
SELECT *
FROM V$NLS_PARAMETERS
WHERE PARAMETER='NLS_DATE_LANGUAGE'

MSSQL
MSSQL提供DATENAME函數可取得部分日期的文字敘述,而DATEPART函數則是取得其整數值,另外,針對常用的年月日部分提供更直接且簡便的YEARMONTHDAY函數,。整理如下表:
語法
說明
DATENAME(datepart, date)
傳回指定日期單位的文字敘述
DATEPART(datepart, date)
傳回指定日期單位的關聯數值
DAY(date)
傳回指定日期的整數值
MONTH(date)
傳回指定日期的月份整數值
YEAR(date)
傳回指定日期的年份整數值
FORMAT(date, format [, culture ] )
2012版本提供字格式轉換功能
DATENAMEDATEPART兩個函數,第一個引數均為時間單位(Datepart),與先前的DATEADD函數所使用的時間間隔單位(Interval)類似,但日期資訊包含更多其他屬性,如星期幾(dw),另外,週(ww)是代表一年中的週數(1-53),MSSQL 2008還提供週的另外定義ISO Week,詳細參數及其說明請查詢官方網站。第二個引數為目標日期。
對於兩個函數傳回值的差異在於月(mm)及週幾(weekday)兩個,DATENAME函數是傳回週幾的文字敘述,下表是以系統時間以相同參數執行的結果。
datepart參數表

執行結果(2020-06-18 22:58:17.158為例
datepart
縮寫
yyyyyy
qqq
mmm
ddd
wkww
hh
min
sss
毫秒
ms
週幾
dwWeekday

dpart
DATENAME
DATEPART
yy
2020
2020
qq
2
2
mm
June
6
dd
18
18
ww
25
25
hh
22
22
mi
58
58
ss
17
17
ms
156
156
dw
Thursday
5

SQL如下透過CROSS APPLY進行轉置如下
SELECT D.*
      --, FORMAT(NOW, dpart) "FMT"
FROM
       (
       SELECT CAST('2020-06-18 22:58:17.158' AS datetime) Now
       ) A
       CROSS APPLY
       (
       SELECT *
       FROM (VALUES ('yy', DATENAME(yy, Now), DATEPART(yy, Now))
                      , ('qq', DATENAME(qq, Now), DATEPART(qq, Now))
                        , ('mm', DATENAME(mm, Now), DATEPART(mm, Now))
                      , ('dd', DATENAME(dd, Now), DATEPART(dd, Now))
                        , ('ww', DATENAME(ww, Now), DATEPART(ww, Now))
                           -------------------------------
                      , ('hh', DATENAME(hh, Now), DATEPART(hh, Now))
                        , ('mi', DATENAME(mi, Now), DATEPART(mi, Now))
                      , ('ss', DATENAME(ss, Now), DATEPART(ss, Now))
                        , ('ms', DATENAME(ms, Now), DATEPART(ms, Now))
                        , ('dw', DATENAME(dw, Now), DATEPART(dw, Now))
              ) DTPart (dpart, "DATENAME", "DATEPART")
        ) D


FORMAT函數使用如下:
FORMAT函數格式字串

2020-06-18 22:58:17.158為例
fmt
說明
yy
(2)
yyyy
(4)
MM
( 01-12)
MMM
(縮寫)
MMMM
(完整)
dd
(01-31)
dddd
週幾 (星期一至日)
d
日期 (ex: 2020/06/18)
hh
小時 ( 01-12, 12小時制)
HH
小時 ( 00-23, 24小時制)
mm
分鐘 ( 00-59)
ss
(00-59)
tt
.下午 (AM or PM)

fmt
default
zh-tw
yy
20
20
yyyy
2020
2020
MM
6
6
MMM
Jun
六月
MMMM
June
六月
dd
18
18
dddd
Thursday
星期四
d
6/18/2020
2020/6/18
hh
10
10
HH
22
22
mm
58
58
ss
17
17
tt
PM
下午
: fmt字串可自行組合
SQL
SELECT fmt
, FORMAT(CAST('2020-06-18 22:58:17.158' as datetime), fmt)          "default"
, FORMAT(CAST('2020-06-18 22:58:17.158' as datetime), fmt, 'zh-tw') "zh-tw"
FROM (VALUES ('yy'), ('yyyy')
                , ('MM'), ('MMM'), ('MMMM')
                , ('dd'), ('dddd'), ('d')
                , ('hh'), ('HH')
                , ('mm'), ('ss')
                , ('tt')
       ) F (fmt)


沒有留言:

張貼留言