Hàm định dạng dạng dữ liệu

Một phần của tài liệu Tài liệu quản trị postgresql (Trang 212 - 218)

Chương 9. Hàm và toán tử

9.8. Hàm định dạng dạng dữ liệu

Các hàm định dạng của PostgreSQL đưa ra một tập hợp các công cụ mạnh để biến đổi các dạng dữ liệu khác nhau (ngày tháng/thời gian, số nguyên, chấm thập phân, số) sang các chuỗi được định dạng và cho việc biến đổi từ các chuỗi được định dạng sang các dạng dữ liệu đặc thù. Bảng 9-20 liệt kê chúng. Các hàm đó tất cả tuân theo một qui ước gọi chung: đối số đầu tiên là giá trị sẽ được định dạng và đối số thứ 2 là một mẫu template xác định định dạng đầu ra hoặc đầu vào.

Một hàm đối số duy nhất to_timestamp cũng sẵn sàng; nó chấp nhận một đối số độ chính xác gấp đôi double precision và biến đổi từ thời Unix (các giây kể từ 1970-01-01 00:00:00+00) thành

timestamp với vùng thời gian time zone. (Số nguyên Interger thời kỳ Unix được đưa ra một cách ngầm định cho độ chính xác gấp đôi double precision).

Bảng 9-20. Các hàm định dạng

Hàm Dạng trả về Mô tả Ví dụ

to_char(timestamp, text) text biến đổi dấu thời gian sang chuỗi to_char(current_timestamp,

’HH12:MI:SS’)

to_char(interval, text) text biến đổi khoảng thời gian sang chuỗi to_char(interval ’15h 2m 12s’, ’HH24:MI:SS’) to_char(int, text) text biến đổi số nguyên sang chuỗi to_char(125, ’999’) to_char(double precision, text) text biến đổi độ chính xác thực/đúp

(real/double) sang chuỗi to_char(125.8::real,

’999D9’)

to_char(numeric, text) text biến đổi số sang chuỗi to_char(-125.8, ’999D99S’) to_date(text, text) date biến đổi chuỗi sang ngày tháng to_date(’05 Dec 2000’,

’DD Mon YYYY’) to_number(text, text) numeric biến đổi chuỗi sang số to_number(’12,454.8-’,

’99G999D9S’) to_timestamp(text, text) timestamp with

time zone biến đổi chuỗi sang dấu thời gian to_timestamp(’05 Dec 2000’,

’DD Mon YYYY’) to_timestamp(double

precision) timestamp with

time zone biến đổi từ thời kỳ Unix sang dấu

thời gian to_timestamp(1284352323)

Trong một chuỗi mẫu temlate đầu ra to_char, có các mẫu nhất định được thừa nhận và được thay thế bằng các dữ liệu được định dạng phù hợp dựa vào giá trị được đưa ra. Bất kỳ văn bản nào mà không

phải là một mẫu template đơn giản sẽ được sao chép y nguyên. Tương tự, trong một chuỗi mẫu template đầu vào (đối với các hàm khác), các mẫu template xác định các giá trị sẽ được chuỗi dữ liệu đầu vào cung cấp.

Bảng 9-21 chỉ ra các mẫu template có sẵn cho việc định dạng các giá trị ngày tháng và thời gian.

Bảng 9-21. Các mẫu template cho việc định dạng ngày tháng / thời gian

Mẫu Mô tả

HH giờ của ngày (01-12)

HH12 giờ của ngày (01-12)

HH24 giờ của ngày (00-23)

MI phút (00-59)

SS giây (00-59)

MS mili giây (000-999)

US mili giây (000000-999999)

SSSS các giây đi qua nửa đêm (0-86399)

AM, am, PM hoặc pm chỉ số meridiem, chỉ nửa ngày đầu và nửa ngày sau (không có các dấu chấm) A.M. , a.m. , P.M. hoặc p.m. chỉ số meridiem, chỉ nửa ngày đầu và nửa ngày sau (có các dấu chấm) Y,YYY năm (4 hoặc nhiều hơn ký tự số) với dấu phẩy

YYYY Năm (4 và nhiều hơn các ký tự số)

YYY 3 ký tự cuối của năm

YY 2 ký tự số cuối của năm

Y ký tự số cuối của năm

IYYY năm theo ISO (4 và nhiều hơn ký tự số)

IYY 3 ký tự số cuối của năm theo ISO

IY 2 ký tự số cuối của năm theo ISO

I ký tự số cuối của năm theo ISO

BC , bc , AD hoặc ad chỉ số kỷ nguyên (không có các dấu chấm) B.C. , b.c. , A.D. hoặc a.d. chỉ số kỷ nguyên (có các dấu chấm)

MONTH tên tháng chữ hoa đầy đủ (dấu trắng - được thêm vào tới 9 ký tự) Month tên tháng chữ hoa đầy đủ (dấu trắng - được thêm vào tới 9 ký tự) month tên tháng chữ thường đầy đủ (dấu trắng - được thêm vào tới 9 ký tự)

MON tên tháng chữ hoa viết tắt (3 ký tự tiếng Anh, độ dài được bản địa hóa khác nhau) Mon tên tháng chữ hoa viết tắt (3 ký tự tiếng Anh, độ dài được bản địa hóa khác nhau) mon tên tháng chữ thường viết tắt (3 ký tự tiếng Anh, độ dài được bản địa hóa khác nhau)

MM số tháng (01-12)

DAY tên ngày chữ hoa đầy đủ (dấu trắng - được thêm vào cho tới 9 ký tự) Day tên ngày chữ hoa đầy đủ (dấu trắng - được thêm vào cho tới 9 ký tự) day tên ngày chữ thường đầy đủ (dấu trắng - được thêm vào cho tới 9 ký tự)

Mẫu Mô tả

DY tên ngày chữ hoa viết tắt (3 ký tự tiếng Anh, độ dài được bản địa hóa khác nhau) Dy tên ngày chữ hoa viết tắt (3 ký tự tiếng Anh, độ dài được bản địa hóa khác nhau) dy tên ngày chữ thường viết tắt (3 ký tự tiếng Anh, độ dài được bản địa hóa khác nhau)

DDD ngày của năm (001-366)

IDDD ISO ngày của năm (001-371; ngày 1 của năm là Thứ hai của tuần đầu tiên theo ISO).

DD ngày của tháng (01-31)

D ngày của tuần, Chủ nhật (1) tới Thứ bảy (7)

ID ISO ngày của tuần, Thứ hai (1) tới Thứ bảy (7)

W tuần của tháng (1-5) (tuần đầu tiên bắt dầu vào ngày đầu tiên của tháng) WW số tuần của năm (1-53) (tuần đầu tiên bắt đầu vào ngày đầu tiên của năm).

IW ISO số tuần của năm (01-53; Thứ năm đầu tiên của năm mới là trong tuần đầu tiên) CC thế kỷ (2 ký tự số) (thế kỷ 21 bắt đầu vào 01/01/2001)

J Ngày theo lịch Julian (các ngày kể từ 24/11 năm 4714 BC vào lúc nửa đêm)

Q Quý (bị bỏ qua bởi to_date và to_timestamp)

RM tháng viết chữ hoa theo các số La mã (I-XII; I = Tháng 1) rm tháng viết chữ thường theo các số La mã (i-xii; i = Tháng 1)

TZ tên vùng thời gian chữ hoa

tz tên vùng thời gian chữ thường

Các sửa đổi có thể được áp dụng cho bất kỳ mẫu template nào để chỉnh sửa hành vi của nó. Ví dụ, FMMonth là mẫu Month với sửa đổi FM. Bảng 9-22 chỉ ra các mẫu sửa đổi cho định dạng ngày tháng / thời gian.

Bảng 9-22. Các sửa đổi mẫu template cho việc định dạng ngày tháng / thời gian

Sửa đổi Mô tả Ví dụ

Tiền tố FM chế độ điền (ngăn chặn các khoảng trống thêm vào và các số 0) FMMonth

Hậu tố TH hậu tố số thông thường chữ hoa DDTH, e.g., 12TH

Hậu tố th hậu tố số thông thường chữ thường DDth, e.g., 12th

Tiền tố FX lựa chọn tổng thể định dạng cố định (xem các lưu ý sử dụng) FX Month DD Day Tiền tố TM chế độ dịch (in các tên ngày và tháng được bản địa hóa dựa vào lc_time) TMMonth

Hậu tố SP chế độ chính tả (không được triển khai) DDSP

Sử dụng các lưu ý cho việc định dạng ngày tháng / thời gian:

• FM ngăn chặn các số 0 đi đầu và các dấu trắng đi sau mà có thể nếu không sẽ được bổ sung thêm vào để làm thành đầu ra của một mẫu có độ rộng cố định. Trong PostgreSQL, FM chỉ sửa đổi đặc tả tiếp theo, trong khi trong Oracle thì FM tác động tới tất cả các đặc tả tiếp sau, và các sửa đổi FM được lặp đi lặp lại, chuyển qua lại bật / tắt chế độ điền.

• TM không bao gồm các khoảng trắng đi sau.

• Nhiều khoảng trắng to_timestamp và to_date skip trong chuỗi đầu vào trừ phi lựa chọn FX

được sử dụng. Ví dụ, to_timestamp(’2000 JUN’, ’YYYY MON’) làm việc, nhưng

to_timestamp(’2000 JUN’, ’FXYYYY MON’) trả về một lỗi vì to_timestamp kỳ vọng một khoảng trống duy nhất. FX phải được chỉ định như là khoản đầu tiên trong mẫu template.

• Văn bản thông thường được phép trong các mẫu template to_char và sẽ là đầu ra theo nghĩa đen. Bạn có thể đặt một chuỗi con trong các dấu ngoặc kép để ép nó sẽ được dịch như là văn bản hằng thậm chí nếu nó có chứa các từ khóa mẫu. Ví dụ trong ’"Hello Year "YYYY’, YYYY sẽ được thay thế bằng dữ liệu năm, nhưng Y duy nhất trong Year thì sẽ không. Trong to_date, to_number, và to_timestamp, các chuỗi trong các dấu ngoặc kép bỏ qua một số ký tự đầu vào có trong chuỗi đó, nghĩa là "XX" bỏ qua 2 ký tự đầu vào.

• Nếu bạn muốn có một dấu ngoặc đơn ở đầu ra thì bạn phải đặt trước nó một dấu chéo ngược, ví dụ E’\\"YYYY Month\\"’. (2 dấu chéo ngược là cần thiết vì dấu chéo ngược có ý nghĩa đặc biệt khi sử dụng cú pháp chuỗi thoát).

• Biến đổi YYYY từ chuỗi sang timestamp hoặc date có một hạn chế khi việc xử lý các năm với hơn 4 ký tự số. Bạn phải sử dụng một số ký tự không phải ký tự số hoặc mẫu template sau

YYYY, nếu không thì năm sẽ luôn được dịch như là 4 ký tự số. Ví dụ (với năm 20000):

to_date(’200001131’, ’YYYYMMDD’) sẽ được dịch như là một năm 4 ký tự số; thay vì sử dụng một sự phân tách không phải ký tự số sau năm, như to_date(’20000-1131’, ’YYYY-MMDD’) hoặc

to_date(’20000Nov31’, ’YYYYMonDD’).

• Trong biến đổi từ chuỗi sang timestamp hoặc date, trường CC (thế kỷ) bị bỏ qua nếu có một trường YYY, YYYY hoặc Y,YYY. Nếu CC được sử dụng với YY hoặc Y thì năm được tính như là

(CC-1)*100+YY.

• Một ngày của tuần theo ISO (khác với ngày theo Gregorian) có thể được chỉ định cho

to_timestamp và to_date theo 1 trong 2 cách:

◦ Năm, tuần và ngày trong tuần: ví dụ to_date(’2006-42-4’, ’IYYY-IW-ID’) sẽ trả về ngày 19/10/2006. Nếu bạn làm mờ ngày trong tuần thì nó được giả thiết sẽ là 1 (Thứ hai).

◦ Năm và ngày của năm: ví dụ to_date(’2006-291’, ’IYYY-IDDD’) cũng sẽ trả về 19/10/2006.

Việc cố gắng xây dựng một ngày bằng việc sử dụng một sự pha trộn các trường tuần theo ISO và ngày tháng theo Gregorian là không có ý nghĩa, và sẽ gây ra lỗi. Trong ngữ cảnh của một năm theo ISO, khái niệm của một “tháng” hoặc “ngày của tháng” không có ý nghĩa.

Trong ngữ cảnh của một năm theo Gregoria, thì tuần theo ISO không có ý nghĩa. Những người sử dụng nên tránh việc trộn các đặc tả ngày tháng theo Gregorian và ISO.

• Trong một biến đổi từ chuỗi sang timestamp, các giá trị mili giây (MS) hoặc mili giây (US) sẽ được sử dụng như là các ký tự số cho các giây sau dấu chấm thập phân. Ví dụ

to_timestamp(’12:3’, ’SS:MS’) không phải là 3 mili giây, mà là 300, vì biến đổi đó tính nó như là 12 + 0.3 giây. Điều này có nghĩa là đối với định dạng SS:MS, các giá trị đầu vào 12:3 , 12:30 và 12:300 chỉ định số các mili giây y hệt. Để có 3 mili giây, phải sử dụng 12:003, để biến đổi tính như là 12 + 0.003 = 12.003 giây.

Đây là một ví dụ phức tạp hơn: to_timestamp(’15:12:02.020.001230’, ’HH:MI:SS.MS.US’) là 15 giờ, 12 phút và 2 giây + 20 mili giây + 1230 micro giây = 2.021230 giây.

• Việc đánh số ngày của tuần của to_char(..., ’ID’) khớp với hàm extract(isodow from ...), nhưng

to_char(..., ’D’) không khớp với việc đánh số ngày của extract(dow from ...).

• to_char(interval) định dạng HH và HH12 như được chỉ ra trong một chiếc đồng hồ 12 giờ, nghĩa là các giờ 0 và 36 cho ra như là 12, trong khi HH24 cho đầu ra giá trị giờ đầy đủ, nó có thể vượt qua 23 trong một khoảng thời gian.

Bảng 9-23 chỉ ra các mẫu template sẵn sàng cho việc định dạng các giá trị số.

Bảng 9-23. Các mẫu template cho việc định dạng số

Mẫu Mô tả

9 giá trị với số các ký tự số được chỉ định

0 giá trị với các số 0 dẫn đầu

. (dấu chấm) dấu thập phân

, (dấu phẩy) dấu phân cách nhóm (hàng ngàn)

PR giá trị âm trong các dấu ngoặc nhọn

S dấu được neo cho số (sử dụng bản địa)

L ký hiệu hiện hành (sử dụng bản địa)

D dấu chấm thập phân (sử dụng bản địa)

G phân cách nhóm (sử dụng bản địa)

MI dấu trừ ở vị trí được chỉ định (nếu số đó nhỏ hơn 0) PL dấu cộng ở vị trí được chỉ định (nếu số đó lớn hơn 0)

SG dấu cộng/trừ ở vị trí được chỉ định

RN số La mã (đầu vào giữa 1 và 3999)

TH hoặc th hậu tố của số thông thường

V số các ký tự số dịch chuyển được chỉ định (xem các lưu ý)

EEEE số mũ cho các ký hiệu khoa học

Sử dụng các lưu ý cho việc định dạng số:

• Một ký hiệu được định dạng bằng việc sử dụng Sài Gòn, PL, hoặc MI không được neo cho số; ví dụ, to_char(-12,’MI9999’) tạo ra ’- 12’ nhưng to_char(-12, ’S9999’) tạo ra ’ -12’. Triển khai của Oracle không cho phép sử dụng MI trước 9, nhưng thay vào đó yêu cầu là 9 đi trước MI.

• 9 dẫn tới một giá trị với số các ký tự số y hệt như có 9 s. Nếu một ký tự số không sẵn sàng

thì nó đưa ra một dấu trắng.

• TH không biến đổi các giá trị ít hơn 0 và không biến đổi các số thập phân.

• PL, SG, và TH là các mở rộng của PostgreSQL.

• V nhân có hiệu lực các giá trị đầu vào với 10^n, trong đó n là số các ký tự số sau V. to_char

không hỗ trợ sử dụng V được kết hợp với một dấu thập phân (nghĩa là, 00.9V99 là không được phép).

• EEEE (ký hiệu khoa học) không thể được sử dụng trong sự kết hợp với bất kỳ mẫu hoặc sửa đổi định dạng nào khác ngoài các mẫu ký tự số và dấu thập phân, và phải đặt ở cuối của chuỗi định dạng (như, 9.99EEEE là một mẫu hợp lệ).

Các sửa đổi nhất định có thể được áp dụng cho bất kỳ mẫu template nào để sửa hành vi của nó. Ví dụ, FM9999 là mẫu 9999 với sửa đổi FM. Bảng 9-24 chỉ ra các mẫu sửa đổi cho việc định dạng số.

Bảng 9-24. Các sửa đổi mẫu template cho việc định dạng số

Sửa đổi Mô tả Ví dụ

Tiền tố FM chế độ điền (ngăn chặn các dấu trắng và 0 thêm vào) FM9999

Hậu tố TH hậu tố số thông thường chữ hoa 999TH

Hậu tố th hậu tố số thông thường chữ thường 999th

Bảng 9-25 chỉ ra một số ví dụ sử dụng hàm to_char. Bảng 9-25. Các ví dụ hàm to_char

Biểu thức Kết quả

to_char(current_timestamp, ’Day, DD HH12:MI:SS’) ’Tuesday , 06 05:39:18’

to_char(current_timestamp, ’FMDay, FMDD HH12:MI:SS’) ’Tuesday, 6 05:39:18’

to_char(-0.1, ’99.99’) ’ -.10’

to_char(-0.1, ’FM9.99’) ’-.1’

to_char(0.1, ’0.9’) ’ 0.1’

to_char(12, ’9990999.9’) ’ 0012.0’

to_char(12, ’FM9990999.9’) ’0012.’

to_char(485, ’999’) ’ 485’

to_char(-485, ’999’) ’-485’

to_char(485, ’9 9 9’) ’ 4 8 5’

to_char(1485, ’9,999’) ’ 1,485’

to_char(1485, ’9G999’) ’ 1 485’

to_char(148.5, ’999.999’) ’ 148.500’

to_char(148.5, ’FM999.999’) ’148.5’

to_char(148.5, ’FM999.990’) ’148.500’

Biểu thức Kết quả

to_char(148.5, ’999D999’) ’ 148,500’

to_char(3148.5, ’9G999D999’) ’ 3 148,500’

to_char(-485, ’999S’) ’485-’

to_char(-485, ’999MI’) ’485-’

to_char(485, ’999MI’) ’485 ’

to_char(485, ’FM999MI’) ’485’

to_char(485, ’PL999’) ’+485’

to_char(485, ’SG999’) ’+485’

to_char(-485, ’SG999’) ’-485’

to_char(-485, ’9SG99’) ’4-85’

to_char(-485, ’999PR’) ’<485>’

to_char(485, ’L999’) ’DM 485

to_char(485, ’RN’) ’ CDLXXXV’

to_char(485, ’FMRN’) ’CDLXXXV’

to_char(5.2, ’FMRN’) ’V’

to_char(482, ’999th’) ’ 482nd’

to_char(485, ’"Good number:"999’) ’Good number: 485’

to_char(485.8, ’"Pre:"999" Post:" .999’) ’Pre: 485 Post: .800’

to_char(12, ’99V999’) ’ 12000’

to_char(12.4, ’99V999’) ’ 12400’

to_char(12.45, ’99V9’) ’ 125’

to_char(0.0004859, ’9.99EEEE’) ’ 4.86e-04’

Một phần của tài liệu Tài liệu quản trị postgresql (Trang 212 - 218)

Tải bản đầy đủ (PDF)

(372 trang)