SQL Server 2012 Date Formats Using the FORMAT Function and CONVERT Function

Standard CONVERT Date Formats
Date Format FORMAT Function CONVERT Function Sample Output
Mon DD YYYY 1
HH:MIAM (or PM)
SELECT FORMAT(SYSDATETIME(), ‘Mon d yyyy h:mmtt’) SELECT CONVERT(VARCHAR(20), SYSDATETIME(), 100) Jun 8 2011 1:30PM 1
MM/DD/YY SELECT FORMAT(SYSDATETIME(), ‘MM/dd/yy’) AS [MM/DD/YY] SELECT CONVERT(VARCHAR(8), SYSDATETIME(), 1) AS [MM/DD/YY] 06/08/11
MM/DD/YYYY SELECT FORMAT(SYSDATETIME(), ‘MM/dd/yyyy’) AS [MM/DD/YYYY] SELECT CONVERT(VARCHAR(10), SYSDATETIME(), 101) AS [MM/DD/YYYY] 06/08/2011
YY.MM.DD SELECT FORMAT(SYSDATETIME(), ‘yy.MM.dd’) AS [YY.MM.DD] SELECT CONVERT(VARCHAR(8), SYSDATETIME(), 2) AS [YY.MM.DD] 11.06.08
YYYY.MM.DD SELECT FORMAT(SYSDATETIME(), ‘yyyy.MM.dd’) AS [YYYY.MM.DD] SELECT CONVERT(VARCHAR(10), SYSDATETIME(), 102) AS [YYYY.MM.DD] 2011.06.08
DD/MM/YY SELECT FORMAT(SYSDATETIME(), ‘dd/MM/yy’) AS [DD/MM/YY] SELECT CONVERT(VARCHAR(8), SYSDATETIME(), 3) AS [DD/MM/YY] 08/06/11
DD/MM/YYYY SELECT FORMAT(SYSDATETIME(), ‘dd/MM/yyyy’) AS [DD/MM/YYYY] SELECT CONVERT(VARCHAR(10), SYSDATETIME(), 103) AS [DD/MM/YYYY] 08/06/2011
DD.MM.YY SELECT FORMAT(SYSDATETIME(), ‘dd.MM.yy’) AS [DD.MM.YY] SELECT CONVERT(VARCHAR(8), SYSDATETIME(), 4) AS [DD.MM.YY] 08.06.11
DD.MM.YYYY SELECT FORMAT(SYSDATETIME(), ‘dd.MM.yyyy’) AS [DD.MM.YYYY] SELECT CONVERT(VARCHAR(10), SYSDATETIME(), 104) AS [DD.MM.YYYY] 08.06.2011
DD-MM-YY SELECT FORMAT(SYSDATETIME(), ‘dd-MM-yy’) AS [DD-MM-YY] SELECT CONVERT(VARCHAR(8), SYSDATETIME(), 5) AS [DD-MM-YY] 08-06-11
DD-MM-YYYY SELECT FORMAT(SYSDATETIME(), ‘dd-MM-yyyy’) AS [DD-MM-YYYY] SELECT CONVERT(VARCHAR(10), SYSDATETIME(), 105) AS [DD-MM-YYYY] 08-06-2011
DD Mon YY 1 SELECT FORMAT(SYSDATETIME(), ‘dd MMM yy’) AS [DD MON YY] SELECT CONVERT(VARCHAR(9), SYSDATETIME(), 6) AS [DD MON YY] 08 Jun 11 1
DD Mon YYYY 1 SELECT FORMAT(SYSDATETIME(), ‘dd MMM yyyy’) AS [DD MON YYYY] SELECT CONVERT(VARCHAR(11), SYSDATETIME(), 106) AS [DD MON YYYY] 08 Jun 2011 1
Mon DD, YY 1 SELECT FORMAT(SYSDATETIME(), ‘MMM dd, yy’) AS [Mon DD, YY] SELECT CONVERT(VARCHAR(10), SYSDATETIME(), 7) AS [Mon DD, YY] Jun 08, 11 1
Mon DD, YYYY 1 SELECT FORMAT(SYSDATETIME(), ‘MMM dd, yyyy’) AS [Mon DD, YYYY] SELECT CONVERT(VARCHAR(12), SYSDATETIME(), 107) AS [Mon DD, YYYY] Jun 08, 2011 1
HH:MM:SS SELECT FORMAT(SYSDATETIME(), ‘HH:mm:ss’) SELECT CONVERT(VARCHAR(8), SYSDATETIME(), 8)
SELECT CONVERT(VARCHAR(8), SYSDATETIME(), 108)
13:30:45
Mon D YYYY H:MI:SS.NNNNNNNAM (or PM) 1 SELECT FORMAT(SYSDATETIME(), ‘MMM d yyyy h:mm:ss.ffffffftt’) SELECT CONVERT(VARCHAR(26), SYSDATETIME(), 9)
SELECT CONVERT(VARCHAR(26), SYSDATETIME(), 109)
Jun 8 2011 1:30:45.9428675PM 1
MM-DD-YY SELECT FORMAT(SYSDATETIME(), ‘MM-dd-yy’) AS [MM-DD-YY] SELECT CONVERT(VARCHAR(8), SYSDATETIME(), 10) AS [MM-DD-YY] 06-08-11
MM-DD-YYYY SELECT FORMAT(SYSDATETIME(), ‘MM-dd-yyyy’) AS [MM-DD-YYYY] SELECT CONVERT(VARCHAR(10), SYSDATETIME(), 110) AS [MM-DD-YYYY] 06-08-2011
YY/MM/DD SELECT FORMAT(SYSDATETIME(), ‘yy/MM/dd’) AS [YY/MM/DD] SELECT CONVERT(VARCHAR(8), SYSDATETIME(), 11) AS [YY/MM/DD] 11/06/08
YYYY/MM/DD SELECT FORMAT(SYSDATETIME(), ‘yyyy/MM/dd’) AS [YYYY/MM/DD] SELECT CONVERT(VARCHAR(10), SYSDATETIME(), 111) AS [YYYY/MM/DD] 2011/06/08
YYMMDD SELECT FORMAT(SYSDATETIME(), ‘yyMMdd’) AS [YYMMDD] SELECT CONVERT(VARCHAR(6), SYSDATETIME(), 12) AS [YYMMDD] 110608
YYYYMMDD SELECT FORMAT(SYSDATETIME(), ‘yyyyMMdd’) AS [YYYYMMDD] SELECT CONVERT(VARCHAR(8), SYSDATETIME(), 112) AS [YYYYMMDD] 20110608
DD Mon YYYY HH:MM:SS.NNNNNNN(24h) 1 SELECT FORMAT(SYSDATETIME(), ‘dd MMM yyyy HH:mm:ss.fffffff’) SELECT CONVERT(VARCHAR(30), SYSDATETIME(), 13)
SELECT CONVERT(VARCHAR(30), SYSDATETIME(), 113)
08 Jun 2011 13:30:45.94286751
HH:MI:SS.NNNNNNN(24H) SELECT FORMAT(SYSDATETIME(), ‘HH:mm:ss.fffffff’) AS [HH:MI:SS:MMM(24H)] SELECT CONVERT(VARCHAR(16), SYSDATETIME(), 14) AS [HH:MI:SS:MMM(24H)]
SELECT CONVERT(VARCHAR(16), SYSDATETIME(), 114) AS [HH:MI:SS:MMM(24H)]
13:30:45.9428675
YYYY-MM-DD HH:MI:SS(24h) SELECT FORMAT(SYSDATETIME(), ‘yyyy-MM-dd HH:mm:ss’) SELECT CONVERT(VARCHAR(19), SYSDATETIME(), 120) 2011-06-08 13:30:45
YYYY-MM-DD HH:MI:SS.NNNNNNN(24h) SELECT FORMAT(SYSDATETIME(), ‘yyyy-MM-dd HH:mm:ss.fffffff’) SELECT CONVERT(VARCHAR(23), SYSDATETIME(), 121) 2011-06-08 13:30:45.9428675
MM/DD/YY HH:MI:SS AM SELECT FORMAT(SYSDATETIME(), ‘MM/dd/yy h:mm:ss tt’) SELECT CONVERT(VARCHAR(20), SYSDATETIME(), 22) 06/08/11 1:30:45 PM
YYYY-MM-DD SELECT FORMAT(SYSDATETIME(), ‘yyyy-MM-dd’) SELECT CONVERT(VARCHAR(26), SYSDATETIME(), 23) 2011-06-091
HH:MI:SS (24h) SELECT FORMAT(SYSDATETIME(), ‘HH:mm:ss’) SELECT CONVERT(VARCHAR(8), SYSDATETIME(), 24) 13:30:45
YYYY-MM-DD HH:MI:SS.NNNNNNN SELECT FORMAT(SYSDATETIME(), ‘yyyy-MM-dd HH:mm:ss.fffffff’) SELECT CONVERT(VARCHAR(26), SYSDATETIME(), 25) 2011-06-08 13:30:45.94286751
YYYY-MM-DDTHH:MM:SS:NNNNNNN SELECT FORMAT(SYSDATETIME(), ‘yyyy-MM-ddTHH:mm:ss.fffffff’) SELECT CONVERT(VARCHAR(27), SYSDATETIME(), 126) 2011-06-08T13:30:45.9428675
DD Mon YYYY HH:MI:SS.NNNNNNNAM 1 SELECT FORMAT(SYSDATETIME(), ‘dd MMM yyyy h:mm:ss.ffffffftt’) SELECT CONVERT(VARCHAR(26), SYSDATETIME(), 130) 08 Jun 2011 1:30:45.9428675PM1
DD/MM/YYYY HH:MI:SS.NNNNNNNAM SELECT FORMAT(SYSDATETIME(), ‘dd/MM/yyyy h:mm:ss.ffffffftt’) SELECT CONVERT(VARCHAR(25), SYSDATETIME(), 131) 08/06/2011 1:30:45.9428675PM

Here are some more date formats that does not come standard in SQL Server as
part of the CONVERT function, together with the corresponding FORMAT function.

Extended Date Formats
Date Format FORMAT Function CONVERT Function Sample Output
YY-MM-DD SELECT FORMAT(SYSDATETIME(), ‘yy-MM-dd’) AS [YY-MM-DD]
SELECT RIGHT(CONVERT(VARCHAR(10), SYSDATETIME(), 20), 8) AS [YY-MM-DD]
SELECT REPLACE(CONVERT(VARCHAR(8), SYSDATETIME(), 11), ‘/’, ‘-‘) AS [YY-MM-DD]
11-06-08
YYYY-MM-DD SELECT FORMAT(SYSDATETIME(), ‘yyyy-MM-dd’) AS [YYYY-MM-DD]
SELECT CONVERT(VARCHAR(10), SYSDATETIME(), 120) AS [YYYY-MM-DD]
SELECT REPLACE(CONVERT(VARCHAR(10), SYSDATETIME(), 111), ‘/’, ‘-‘) AS [YYYY-MM-DD]
2011-06-08
YYYY-M-D SELECT FORMAT(SYSDATETIME(), ‘yyyy-M-d’) AS [YYYY-M-D] SELECT CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) + ‘-‘ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘-‘ + CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) AS [YYYY-M-D] 2011-6-8
YY-M-D SELECT FORMAT(SYSDATETIME(), ‘yy-M-d’) AS [YY-M-D] SELECT RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) + ‘-‘ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘-‘ + CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) AS [YY-M-D] 11-6-8
M-D-YYYY SELECT FORMAT(SYSDATETIME(), ‘M-d-yyyy’) AS [M-D-YYYY] SELECT CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘-‘ + CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘-‘ + CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) AS [M-D-YYYY] 6-8-2011
M-D-YY SELECT FORMAT(SYSDATETIME(), ‘M-d-yy’) AS [M-D-YY] SELECT CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘-‘ + CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘-‘ + RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) AS [M-D-YY] 6-8-11
D-M-YYYY SELECT FORMAT(SYSDATETIME(), ‘d-M-yyyy’) AS [D-M-YYYY] SELECT CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘-‘ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘-‘ + CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) AS [D-M-YYYY] 8-6-2011
D-M-YY SELECT FORMAT(SYSDATETIME(), ‘d-M-yy’) AS [D-M-YY] SELECT CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘-‘ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘-‘ + RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) AS [D-M-YY] 8-6-11
YY-MM SELECT FORMAT(SYSDATETIME(), ‘yy-MM’) AS [YY-MM] SELECT RIGHT(CONVERT(VARCHAR(7), SYSDATETIME(), 20), 5) AS [YY-MM]
SELECT SUBSTRING(CONVERT(VARCHAR(10), SYSDATETIME(), 120), 3, 5) AS [YY-MM]
11-06
YYYY-MM SELECT FORMAT(SYSDATETIME(), ‘yyyy-MM’) AS [YYYY-MM] SELECT CONVERT(VARCHAR(7), SYSDATETIME(), 120) AS [YYYY-MM] 2011-06
YY-M SELECT FORMAT(SYSDATETIME(), ‘yy-M’) AS [YY-M] SELECT RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) + ‘-‘ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) AS [YY-M] 11-6
YYYY-M SELECT FORMAT(SYSDATETIME(), ‘yyyy-M’) AS [YYYY-M] SELECT CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) + ‘-‘ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) AS [YYYY-M] 2011-6
MM-YY SELECT FORMAT(SYSDATETIME(), ‘MM-yy’) AS [MM-YY] SELECT RIGHT(CONVERT(VARCHAR(8), SYSDATETIME(), 5), 5) AS [MM-YY]
SELECT SUBSTRING(CONVERT(VARCHAR(8), SYSDATETIME(), 5), 4, 5) AS [MM-YY]
06-11
MM-YYYY SELECT FORMAT(SYSDATETIME(), ‘MM-yyyy’) AS [MM-YYYY] SELECT RIGHT(CONVERT(VARCHAR(10), SYSDATETIME(), 105), 7) AS [MM-YYYY] 06-2011
M-YY SELECT FORMAT(SYSDATETIME(), ‘M-yy’) AS [M-YY] SELECT CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘-‘ + RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) AS [M-YY] 6-11
M-YYYY SELECT FORMAT(SYSDATETIME(), ‘M-yyyy’) AS [M-YYYY] SELECT CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘-‘ + CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) AS [M-YYYY] 6-2011
MM-DD SELECT FORMAT(SYSDATETIME(), ‘MM-dd’) AS [MM-DD] SELECT CONVERT(VARCHAR(5), SYSDATETIME(), 10) AS [MM-DD] 06-08
DD-MM SELECT FORMAT(SYSDATETIME(), ‘dd-MM’) AS [DD-MM] SELECT CONVERT(VARCHAR(5), SYSDATETIME(), 5) AS [DD-MM] 08-06
M-D SELECT FORMAT(SYSDATETIME(), ‘M-d’) AS [M-D] SELECT CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘-‘ + CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) AS [M-D] 6-8
D-M SELECT FORMAT(SYSDATETIME(), ‘d-M’) AS [D-M] SELECT CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘-‘ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) AS [D-M] 8-6
M/D/YYYY SELECT FORMAT(SYSDATETIME(), ‘M/d/yyyy’) AS [M/D/YYYY] SELECT CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘/’ + CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘/’ + CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) AS [M/D/YYYY] 6/8/2011
M/D/YY SELECT FORMAT(SYSDATETIME(), ‘M/d/yy’) AS [M/D/YY] SELECT CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘/’ + CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘/’ + RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) AS [M/D/YY] 6/8/11
D/M/YYYY SELECT FORMAT(SYSDATETIME(), ‘d/M/yyyy’) AS [D/M/YYYY] SELECT CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘/’ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘/’ + CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) AS [D/M/YYYY] 8/6/2011
D/M/YY SELECT FORMAT(SYSDATETIME(), ‘d/M/yy’) AS [D/M/YY] SELECT CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘/’ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘/’ + RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) AS [D/M/YY] 8/6/11
YYYY/M/D SELECT FORMAT(SYSDATETIME(), ‘yyyy/M/d’) AS [YYYY/M/D] SELECT CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) + ‘/’ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘/’ + CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) AS [YYYY/M/D] 2011/6/8
YY/M/D SELECT FORMAT(SYSDATETIME(), ‘yy/M/d’) AS [YY/M/D] SELECT RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) + ‘/’ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘/’ + CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) AS [YY/M/D] 11/6/8
MM/YY SELECT FORMAT(SYSDATETIME(), ‘MM/yy’) AS [MM/YY] SELECT RIGHT(CONVERT(VARCHAR(8), SYSDATETIME(), 3), 5) AS [MM/YY] 06/11
MM/YYYY SELECT FORMAT(SYSDATETIME(), ‘MM/yyyy’) AS [MM/YYYY] SELECT RIGHT(CONVERT(VARCHAR(10), SYSDATETIME(), 103), 7) AS [MM/YYYY] 06/2011
M/YY SELECT FORMAT(SYSDATETIME(), ‘M/yy’) AS [M/YY] SELECT CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘/’ + RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) AS [M/YY] 6/11
M/YYYY SELECT FORMAT(SYSDATETIME(), ‘M/yyyy’) AS [M/YYYY] SELECT CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘/’ + CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) AS [M/YYYY] 6/2011
YY/MM SELECT FORMAT(SYSDATETIME(), ‘yy/MM’) AS [YY/MM] SELECT CONVERT(VARCHAR(5), SYSDATETIME(), 11) AS [YY/MM] 11/06
YYYY/MM SELECT FORMAT(SYSDATETIME(), ‘yyyy/MM’) AS [YYYY/MM] SELECT CONVERT(VARCHAR(7), SYSDATETIME(), 111) AS [YYYY/MM] 2011/06
YY/M SELECT FORMAT(SYSDATETIME(), ‘yy/M’) AS [YY/M] SELECT RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) + ‘/’ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) AS [YY/M] 11/6
YYYY/M SELECT FORMAT(SYSDATETIME(), ‘yyyy/M’) AS [YYYY/M] SELECT CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) + ‘/’ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) AS [YYYY/M] 2011/6
MM/DD SELECT FORMAT(SYSDATETIME(), ‘MM/dd’) AS [MM/DD] SELECT CONVERT(VARCHAR(5), SYSDATETIME(), 1) AS [MM/DD] 06/08
DD/MM SELECT FORMAT(SYSDATETIME(), ‘dd/MM’) AS [DD/MM] SELECT CONVERT(VARCHAR(5), SYSDATETIME(), 3) AS [DD/MM] 08/06
M/D SELECT FORMAT(SYSDATETIME(), ‘M/d’) AS [M/D] SELECT CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘/’ + CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) AS [M/D] 6/8
D/M SELECT FORMAT(SYSDATETIME(), ‘d/M’) AS [D/M] SELECT CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘/’ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) AS [D/M] 8/6
MM.DD.YYYY SELECT FORMAT(SYSDATETIME(), ‘MM.dd.yyyy’) AS [MM.DD.YYYY] SELECT REPLACE(CONVERT(VARCHAR(10), SYSDATETIME(), 101), ‘/’, ‘.’) AS [MM.DD.YYYY] 06.08.2011
MM.DD.YY SELECT FORMAT(SYSDATETIME(), ‘MM.dd.yy’) AS [MM.DD.YY] SELECT REPLACE(CONVERT(VARCHAR(8), SYSDATETIME(), 1), ‘/’, ‘.’) AS [MM.DD.YY] 06.08.11
M.D.YYYY SELECT FORMAT(SYSDATETIME(), ‘M.d.yyyy’) AS [M.D.YYYY] SELECT CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘.’ + CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘.’ + CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) AS [M.D.YYYY] 6.8.2011
M.D.YY SELECT FORMAT(SYSDATETIME(), ‘M.d.yy’) AS [M.D.YY] SELECT CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘.’ + CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘.’ + RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) AS [M.D.YY] 6.8.11
DD.MM.YYYY SELECT FORMAT(SYSDATETIME(), ‘dd.MM.yyyy’) AS [DD.MM.YYYY] SELECT CONVERT(VARCHAR(10), SYSDATETIME(), 104) AS [DD.MM.YYYY] 08.06.2011
DD.MM.YY SELECT FORMAT(SYSDATETIME(), ‘dd.MM.yy’) AS [DD.MM.YY] SELECT CONVERT(VARCHAR(10), SYSDATETIME(), 4) AS [DD.MM.YY] 08.06.11
D.M.YYYY SELECT FORMAT(SYSDATETIME(), ‘d.M.yyyy’) AS [D.M.YYYY] SELECT CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘.’ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘.’ + CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) AS [D.M.YYYY] 8.6.2011
D.M.YY SELECT FORMAT(SYSDATETIME(), ‘d.M.yy’) AS [D.M.YY] SELECT CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘.’ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘.’ + RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) AS [D.M.YY] 8.6.11
YYYY.M.D SELECT FORMAT(SYSDATETIME(), ‘yyyy.M.d’) AS [YYYY.M.D] SELECT CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) + ‘.’ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘.’ + CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) AS [YYYY.M.D] 2011.6.8
YY.M.D SELECT FORMAT(SYSDATETIME(), ‘yy.M.d’) AS [YY.M.D] SELECT RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) + ‘.’ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘.’ + CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) AS [YY.M.D] 11.6.8
MM.YYYY SELECT FORMAT(SYSDATETIME(), ‘MM.yyyy’) AS [MM.YYYY] SELECT RIGHT(CONVERT(VARCHAR(10), SYSDATETIME(), 104), 7) AS [MM.YYYY] 06.2011
MM.YY SELECT FORMAT(SYSDATETIME(), ‘MM.yy’) AS [MM.YY] SELECT RIGHT(CONVERT(VARCHAR(8), SYSDATETIME(), 4), 5) AS [MM.YY] 06.11
M.YYYY SELECT FORMAT(SYSDATETIME(), ‘M.yyyy’) AS [M.YYYY] SELECT CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘.’ + CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) AS [M.YYYY] 6.2011
M.YY SELECT FORMAT(SYSDATETIME(), ‘M.yy’) AS [M.YY] SELECT CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) + ‘.’ + RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) AS [M.YY] 6.11
YYYY.MM SELECT FORMAT(SYSDATETIME(), ‘yyyy.MM’) AS [YYYY.MM] SELECT CONVERT(VARCHAR(7), SYSDATETIME(), 102) AS [YYYY.MM] 2011.06
YY.MM SELECT FORMAT(SYSDATETIME(), ‘yy.MM’) AS [YY.MM] SELECT CONVERT(VARCHAR(5), SYSDATETIME(), 2) AS [YY.MM] 11.06
YYYY.M SELECT FORMAT(SYSDATETIME(), ‘yyyy.M’) AS [YYYY.M] SELECT CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)) + ‘.’ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) AS [YYYY.M] 2011.6
YY.M SELECT FORMAT(SYSDATETIME(), ‘yy.M’) AS [YY.M] SELECT RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) + ‘.’ + CAST(MONTH(SYSDATETIME()) AS VARCHAR(2)) AS [YY.M] 11.6
MM.DD SELECT FORMAT(SYSDATETIME(), ‘MM.dd’) AS [MM.DD] SELECT RIGHT(CONVERT(VARCHAR(8), SYSDATETIME(), 2), 5) AS [MM.DD] 06.08
DD.MM SELECT FORMAT(SYSDATETIME(), ‘dd.MM’) AS [DD.MM] SELECT CONVERT(VARCHAR(5), SYSDATETIME(), 4) AS [DD.MM] 08.06
MMDDYYYY SELECT REPLACE(CONVERT(VARCHAR(10), SYSDATETIME(), 101), ‘/’, ”) AS [MMDDYYYY] 06082011
MMDDYY SELECT REPLACE(CONVERT(VARCHAR(8), SYSDATETIME(), 1), ‘/’, ”) AS [MMDDYY] 060811
DDMMYYYY SELECT FORMAT(SYSDATETIME(), ‘ddMMyyyy’) AS [DDMMYYYY] SELECT REPLACE(CONVERT(VARCHAR(10), SYSDATETIME(), 103), ‘/’, ”) AS [DDMMYYYY] 08062011
DDMMYY SELECT FORMAT(SYSDATETIME(), ‘ddMMyy’) AS [DDMMYY] SELECT REPLACE(CONVERT(VARCHAR(8), SYSDATETIME(), 3), ‘/’, ”) AS [DDMMYY] 080611
MMYYYY SELECT FORMAT(SYSDATETIME(), ‘MMyyyy’) AS [MMYYYY] SELECT RIGHT(REPLACE(CONVERT(VARCHAR(10), SYSDATETIME(), 103), ‘/’, ”), 6) AS [MMYYYY] 062011
MMYY SELECT FORMAT(SYSDATETIME(), ‘MMyy’) AS [MMYY] SELECT RIGHT(REPLACE(CONVERT(VARCHAR(8), SYSDATETIME(), 3), ‘/’, ”), 4) AS [MMYY] 0611
YYYYMM SELECT FORMAT(SYSDATETIME(), ‘yyyyMM’) AS [YYYYMM] SELECT CONVERT(VARCHAR(6), SYSDATETIME(), 112) AS [YYYYMM] 201106
YYMM SELECT FORMAT(SYSDATETIME(), ‘yyMM’) AS [YYMM] SELECT CONVERT(VARCHAR(4), SYSDATETIME(), 12) AS [YYMM] 1106
Month DD, YYYY 1 SELECT FORMAT(SYSDATETIME(), ‘MMMM dd, yyyy’) AS [Month DD, YYYY] SELECT DATENAME(MONTH, SYSDATETIME())+ ‘ ‘ + RIGHT(‘0’ + DATENAME(DAY, SYSDATETIME()), 2) + ‘, ‘ + DATENAME(YEAR, SYSDATETIME())
AS [Month DD, YYYY]
June 08, 2011 1
Mon YYYY 1 SELECT FORMAT(SYSDATETIME(), ‘MMM yyyy’) AS [Mon YYYY] SELECT LEFT(DATENAME(MONTH, SYSDATETIME()), 3) + ‘ ‘ + DATENAME(YEAR, SYSDATETIME()) AS [Mon YYYY] Jun 2011 1
Month YYYY 1 SELECT FORMAT(SYSDATETIME(), ‘MMMM yyyy’) AS [Month YYYY] SELECT DATENAME(MONTH, SYSDATETIME()) + ‘ ‘ + DATENAME(YEAR, SYSDATETIME()) AS
[Month YYYY]
June 2011 1
DD Month 1 SELECT FORMAT(SYSDATETIME(), ‘dd MMMM’) AS [DD Month] SELECT RIGHT(‘0’ + DATENAME(DAY, SYSDATETIME()), 2) + ‘ ‘ + DATENAME(MONTH, SYSDATETIME()) AS
[DD Month]
08 June 1
Month DD 1 SELECT FORMAT(SYSDATETIME(), ‘MMMM dd’) AS [Month DD] SELECT DATENAME(MONTH, SYSDATETIME()) + ‘ ‘ + RIGHT(‘0’ + DATENAME(DAY, SYSDATETIME()), 2) AS
[Month DD]
June 08 1
DD Month YY 1 SELECT FORMAT(SYSDATETIME(), ‘dd MMMM yy’) AS [DD Month YY] SELECT CAST(DAY(SYSDATETIME()) AS VARCHAR(2)) + ‘ ‘ + DATENAME(MM, SYSDATETIME()) + ‘ ‘
+ RIGHT(CAST(YEAR(SYSDATETIME()) AS VARCHAR(4)), 2) AS [DD Month YY]
08 June 11 1
DD Month YYYY 1 SELECT FORMAT(SYSDATETIME(), ‘dd MMMM yyyy’) AS [DD Month YYYY] SELECT RIGHT(‘0’ + DATENAME(DAY, SYSDATETIME()), 2) + ‘ ‘ + DATENAME(MONTH, SYSDATETIME())+ ‘ ‘ + DATENAME(YEAR, SYSDATETIME()) AS [DD Month YYYY] 08 June 2011 1
Mon-YY 1 SELECT FORMAT(SYSDATETIME(), ‘MMM-yy’) AS [Mon-YY] SELECT REPLACE(RIGHT(CONVERT(VARCHAR(9), SYSDATETIME(), 6), 6), ‘ ‘, ‘-‘) AS
[Mon-YY]
Jun-08 1
Mon-YYYY 1 SELECT FORMAT(SYSDATETIME(), ‘MMM-yyyy’) AS [Mon-YYYY] SELECT REPLACE(RIGHT(CONVERT(VARCHAR(11), SYSDATETIME(), 106), 8), ‘ ‘, ‘-‘) AS
[Mon-YYYY]
Jun-2011 1
DD-Mon-YY 1 SELECT FORMAT(SYSDATETIME(), ‘dd-MMM-yy’) AS [DD-Mon-YY] SELECT REPLACE(CONVERT(VARCHAR(9), SYSDATETIME(), 6), ‘ ‘, ‘-‘) AS [DD-Mon-YY] 08-Jun-11 1
DD-Mon-YYYY 1 SELECT FORMAT(SYSDATETIME(), ‘dd-MMM-yyyy’) AS [DD-Mon-YYYY] SELECT REPLACE(CONVERT(VARCHAR(11), SYSDATETIME(), 106), ‘ ‘, ‘-‘) AS [DD-Mon-YYYY] 08-Jun-2011 1

Can not drop user from database SQL Server 2008 later

Ví dụ có user name: ‘usersyn’, nhưng không xoá được user này trong database

Step 1:

–Chay đoạn lệnh kiểm tra

select * from sys.schemas where principal_id = user_id(‘usersyn’)

image001

Mục đích xem thử user đó đang có schema nào. Ở đây ta thấy nó có schema ‘db_datawriter’.

Step 2:

Xổ mục schemas ra. Tìm đến db_datawriter và xoá nó đi

image003

Step 3:

Bây giờ có thể delete user: ‘usersyn’ bình thường

image005

EXCEPT SQL SERVER

DECLARE @T1 TABLE (COL1 char(1));
DECLARE @T2 TABLE (COL1 char(1));

INSERT INTO @T1 VALUES ('A'),('B');
INSERT INTO @T2 VALUES ('A'),(null);

SET ANSI_NULLS ON
SELECT COL1 FROM @T1 WHERE COL1 NOT IN (SELECT COL1 FROM @T2)

--Su dung not exits giống sử dụng except hoặc sử dụng Not In
SELECT COL1 FROM @T1 T1 WHERE NOT EXISTS (SELECT * FROM @T2 T2 WHERE T2.COL1=T1.COL1)

SELECT COL1 FROM @T1 EXCEPT SELECT COL1 FROM @T2;

Entity Framework Spatial – EF Designer (EF5 onwards)

Nguồn Entity Framework Spatial – EF Designer (EF5 onwards)

Spatial Types in the Entity Framework – Entity Framework Design

Nguồn Spatial Types in the Entity Framework – Entity Framework Design

Ranking trong SQL Server

Các hàm Ranking là gì?

Các hàm Ranking cho phép bạn có thể đánh số liên tục (xếp loại) cho các tập hợp kết quả. Các hàm này có thể được sử dụng để cung cấp số thứ tự trong hệ thống đánh số tuần tự khác nhau. Có thể hiểu đơn giản như sau: bạn có từng con số nằm trên từng dòng liên tục, tại dòng thứ nhất xếp loại số 1, dòng thứ 2 xếp loại số là 2… Bạn có thể sử dụng hàm ranking theo các nhóm số tuần tự, mỗi một nhóm sẽ được đánh số theo lược đồ 1,2,3 và nhóm tiếp theo lại bắt đầu bằng 1,2,3…

Dữ liệu chạy thử cho các ví dụ

Để có một vài ví dụ cho từng hàm ranking, tôi cần thiết lập một số dữ liệu chạy thử. Trong dữ liệu chạy thử, tôi sử dụng một bảng “Person” khá đơn giản. Bảng sẽ bao gồm 3 cột “FirstName”, “Age” và “Gender”. Đoạn mã dưới nhằm tạo ra và ghi lại dữ liệu chạy thử vào file.

SET NOCOUNT ON
CREATE TABLE Person(
FirstName VARCHAR(10),
Age INT,
Gender CHAR(1))
INSERT INTO Person VALUES (‘Ted’,23,’M’)
INSERT INTO Person VALUES (‘John’,40,’M’)
INSERT INTO Person VALUES (‘George’,6,’M’)
INSERT INTO Person VALUES (‘Mary’,11,’F’)
INSERT INTO Person VALUES (‘Sam’,17,’M’)
INSERT INTO Person VALUES (‘Doris’,6,’F’)
INSERT INTO Person VALUES (‘Frank’,38,’M’)
INSERT INTO Person VALUES (‘Larry’,5,’M’)
INSERT INTO Person VALUES (‘Sue’,29,’F’)
INSERT INTO Person VALUES (‘Sherry’,11,’F’)
INSERT INTO Person VALUES (‘Marty’,23,’F’)

Hàm ROW_NUMBER

Hàm đầu tiên tôi muốn nói tới là ROW_NUMBER. Hàm này trả lại một dãy số tuần tự bắt đầu từ 1 cho mỗi dòng hay nhóm trong tập hợp kết quả. Hàm ROW_NUMBER sẽ có cú pháp sau:

ROW_NUMBER ( ) OVER ( [ ] )

Trong đó:

là cột hay tập hợp các cột được sử dụng để quyết định việc gộp nhóm cho hàm ROW_NUMBER áp dụng cho việc đánh số tuần tự.

là một cột hay tập hợp các cột được sử dụng để sắp xếp tập hợp kết quả trong nhóm (partition)

Để hiểu thêm về cách sử dụng hàm ROW_NUMBER, ví dụ dưới sẽ đánh số liên tục cho tất cả các dòng trong bảng Person và sắp xếp chúng theo trường Age

SELECT ROW_NUMBER() OVER (ORDER BY Age) AS [Row Number by Age],
FirstName,
Age
FROM Person

 

Và đây là tập hợp kết quả mã T-SQL trên:

Row Number by Age    FirstName   Age
——————– ———- ——
1                    Larry        5
2                    Doris        6
3                    George       6
4                    Mary         11
5                    Sherry       11
6                    Sam          17
7                    Ted          23
8                    Marty        23
9                    Sue          29
10                   Frank        38
11                   John         40

Bạn có thể thấy tôi đã đánh số liên tục cho toàn bộ các dòng trong bảng Person bắt đầu từ số 1, và tập hợp kết quả được sắp xếp theo cột Age. Sự sắp xếp này được hoàn thiện là do tiêu chuẩn “ORDER BY Age” trong mệnh đề ORDER BY của hàm ROW_NUMBER.

Giả sử bạn không muốn tập hợp kết quả của bạn được sắp xếp mà muốn đưa bảng trở lại sắp xếp theo số bản ghi của từng dòng. Hàm ROW_NUMBER lại luôn yêu cầu phải có mệnh đề ORDER BY, vậy bạn cần phải đưa một giá trị nào đó vào trong mệnh đề này. Trong hàm truy vấn bên dưới tôi đã chỉ định “SELECT 1” vào trong mệnh đề ORDER BY, điều này sẽ chỉ trả lại kết quả là bảng như đã lưu trữ ban đầu và tất nhiên cách đánh số tuần tự vẫn bắt đầu từ 1:

SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS [Row Number by Record Set],
FirstName,
Age
FROM Person

 

Đây là tập hợp kết quả khi chạy hàm truy vấn trên:

Row Number by Record FirstName   Age
——————– ———- ——
1                    Ted          23
2                    John         40
3                    George       6
4                    Mary         11
5                    Sam          17
6                    Doris        6
7                    Frank        38
8                    Larry        5
9                    Sue          29
10                   Sherry       11
11                   Marty        23

Hàm ROW_NUMBER không chỉ cho phép bạn sắp xếp toàn bộ tập hợp dòng mà còn có thể sử dụng mệnh đề PARTITION để lọc ra nhóm dòng cần đánh số. Các dòng sẽ được đánh số tuần tự trong từng giá trị PARTITION độc nhất. Các dãy số được đánh sẽ luôn bắt đầu từ 1 cho từng giá trị PARTITION mới trong tập hợp bản ghi của bạn. Hãy xem hàm truy vấn dưới đây

SELECT ROW_NUMBER() OVER (PARTITION BY Gender ORDER BY Age) AS [Partition by Gender],
FirstName,
Age,
Gender
FROM Person

 

Khi chạy truy vấn trên, tập hợp kết quả sẽ ra như sau:

Partition by Gender  FirstName  Age         Gender
——————– ———- ———– ——
1                    Doris      6           F
2                    Mary       11          F
3                    Sherry     11          F
4                    Sue        29          F
1                    Larry      5           M
2                    George     6           M
3                    Sam        17          M
4                    Ted        23          M
5                    Marty      23          M
6                    Frank      38          M
7                    John       40          M

Trong ví dụ này tôi đã phân vùng bởi Gender và sắp xếp theo Age. Thực hành theo ví dụ này sẽ cho phép tôi đánh số tuần tự các bản ghi là Female trong bảng Person theo độ tuổi, và sau đó việc đánh số sẽ bắt đầu lại với nhóm là Male.

Hàm RANK

Đôi khi bạn muốn một dòng có cùng sắp xếp giá trị cột như các dòng khác có cùng một xếp loại. Nếu thế thì hàm RANK () có thể giúp bạn. Hàm RANK có cú pháp như sau:

RANK ( ) OVER ( [] )

Trong đó:

là một cột hay tập hợp các cột được sử dụng để quyết đinh việc đánh số liên tục trong hàm RANK

là một cột hay tập hợp các cột được sử dụng để sắp xếp tập hợp kết quả trong nhóm (partition)

Hàm RANK sẽ đánh số liên tục một tập hợp bản ghi nhưng khi có 2 dòng có cùng giá trị sắp xếp thì hàm sẽ đánh giá là cùng bậc giá trị. Giá trị xếp loại vẫn sẽ tăng kể cả khi có 2 dòng cùng giá trị, vì vậy khi đánh giá một giá trị sắp xếp tiếp theo thì số thứ tự vẫn tiếp tục được đánh nhưng sẽ tăng thêm 1 giá trị vào các dòng tiếp theo trong tập hợp.

Đây là ví dụ của hàm rank trong tập hợp bản ghi sắp xếp theo Age:

SELECT RANK() OVER (ORDER BY Age) AS [Rank by Age],
FirstName,
Age
FROM Person

Và kết quả trả về:

Rank by Age          FirstName  Age
——————– ———- ——
1                    Larry      5
2                    Doris      6
2                    George     6
4                    Mary       11
4                    Sherry     11
6                    Sam        17
7                    Ted        23
7                    Marty      23
9                    Sue        29
10                   Frank      38
11                   John       40

Như bạn thấy, với các dòng trùng giá trị Age thì ở phần Rank by Age cũng có cùng giá trị. Bạn có thể thấy Doris và George, Mary và Sherry, cũng tương tự là Ted và Marty, từng cặp một đều có cùng giá trị Rank by Age. Lưu ý rằng Doris và George cùng có xếp loại là 2 nhưng xếp loại của Mary (có giá trị Age tiếp theo) lại không phải 3 mà là 4. Nguyên nhân ở đây là Mary được trả về bản ghi thứ 4 trong tập hợp bản ghi, và hàm RANK() đã lấy số liệu đó khi thiết lập giá trị xếp loại tiếp theo trong Rank by Age

Nếu bạn muốn có một nhiều xếp loại trong tập hợp bản ghi của mình thì với từng xếp loại bạn cần đặt một nhóm cụ thể bằng cách sử dụng mệnh đề PARTITION BY trong hàm RANK. Ví dụ dưới sẽ cho thấy tác dụng khi tôi nhóm xếp loại theo Gender và sắp xếp theo Age

SELECT RANK() OVER (PARTITION BY Gender ORDER BY Age) AS [Partition by Gender],
FirstName,
Age,
Gender
FROM Person

Đây là kết quả khi chạy các hàm truy vấn trên:

Partition by Gender  FirstName  Age         Gender
——————– ———- ———– ——
1                    Doris      6           F
2                    Mary       11          F
2                    Sherry     11          F
4                    Sue        29          F
1                    Larry      5           M
2                    George     6           M
3                    Sam        17          M
4                    Ted        23          M
4                    Marty      23          M
6                    Frank      38          M
7                    John       40          M

Bạn có thể thấy là Gioitinh là “F” được bắt đầu xếp loại từ 1 cho đến 4, sau đó bắt đầu đánh số lại từ 1 cho Gioitinh là “M”

Hàm DENSE_RANK

Hàm DENSE_RANK cũng giống như hàm RANK, tuy vậy, hàm này không cung cấp khoảng cách giữa các số xếp loại. Thay vào đó, hàm này sẽ xếp loại liên tục cho từng giá trị ORDER BY cụ thể. Với hàm DENSE_RANK, kể cả khi có hai dòng có cùng giá trị xếp loại thì dòng tiếp theo vẫn chỉ tăng thêm một giá trị so với dòng trên. Hàm DENSE_RANK có cú pháp như hàm RANK.

Đây là hàm DENSE_RANK được tôi sử dụng để xếp loại cho toàn bộ các bản ghi trong bảng Person theo trường Age

SELECT DENSE_RANK() OVER (ORDER BY Age) AS [Dense Rank by Age],
FirstName,
Age
FROM Person

 

Đoạn mã trên sẽ xuất ra như sau:

Dense Rank by Age    FirstName  Age
——————– ———- ———–
1                    Larry      5
2                    Doris      6
2                    George     6
3                    Mary       11
3                    Sherry     11
4                    Sam        17
5                    Ted        23
5                    Marty      23
6                    Sue        29
7                    Frank      38
8                    John       40

 

Như bạn thấy các số trong cột “Dense Rank By Age” vẫn đảm bảo tính liên tục, không hề bị ngắt quãng kể cả khi có hai dòng cùng giá trị ORDER BY và giá trị xếp loại như Ted và Marty.

Hàm NTILE

Hàm cuối cùng là hàm NTILE. Đây là hàm được sử dụng để phá vỡ tập hợp bản ghi trong một số cụ thể của các nhóm. Hàm NTILE cũng sử dụng cú pháp như các hàm ranking khác.

Trong ví dụ đầu của hàm này, tôi sẽ nhóm các bản ghi trong bảng Person thành 3 nhóm khác nhau. Tôi muốn các nhóm này dựa trên cột Age. Để làm được điều này, tôi sẽ chạy T-SQL sau:

SELECT FirstName,
Age,
NTILE(3) OVER (ORDER BY Age) AS [Age Groups]
FROM Person

 

Đây là tập hợp kết quả của tôi từ câu lệnh T-SQL trên:

FirstName  Age         Age Groups
———- ———– ——————–
Larry      5           1
Doris      6           1
George     6           1
Mary       11          1
Sherry     11          2
Sam        17          2
Ted        23          2
Marty      23          2
Sue        29          3
Frank      38          3
John       40          3

 

Trong tập hợp kết quả đã có ở trên với 3 nhóm Age khác nhau. Nhóm đầu tiên bắt đầu từ 5 đến 11 tuổi, nhóm thứ 2 bắt đầu từ 11 đến 23 và nhóm cuối cùng là từ 29 đến 40. Hàm NTILE chỉ có tác dụng chia đều số lượng các bản ghi và đưa vào từng nhóm số. Sử dụng hàm NTILE cho từng bản ghi trong một nhóm sẽ đưa ra các xếp loại giống nhau.

Hàm NTILE là một hàm rất có ích nếu bạn chỉ muốn trả lại một nhóm cụ thể trong các bản ghi. Dưới đây là một ví dụ khi tôi muốn trả lại chỉ nhóm người có độ tuổi trung bình (Nhóm Age 2) từ ví dụ trên.

SELECT FirstName,
Age,
Age AS [Age Group]
FROM ( SELECT FirstName,
Age,
NTILE(3) OVER (ORDER BY Age) AS AgeGroup
FROM Person) A
WHERE AgeGroup = 2

 

Kết quả của câu lệnh trên:

FirstName  Age         Age Group
———- ———– ———–
Sherry     11          11
Sam        17          17
Ted        23          23
Marty      23          23

 

Kết luận

Mã hóa một quy trình sắp xếp các số tuần tự trong tập hợp bản ghi được sử dụng để lấy một số trong các dòng của mã. SQL Server 2005 đã đưa ra một vài hàm ranking mới. Hy vong trong thời gian tới bạn sẽ cần xếp loại cho các tập hợp bản ghi của mình và một trong các hàm đã được giới thiệu trong bài sẽ giúp bạn hoàn thành công việc đó, nó là một việc hoàn toàn đơn giản.

Nguồn: quantrimang.com

Định dạng trường Numeric có dấu phẩy

Bạn có trường Price là trường Numeric (giả sử có giá trị 123456) trong bảng tblProduct. Trong câu lệnh Select bạn muốn in ra giá trị được định dạng là : 123,456 thì dùng câu lệnh như sau Select SubString(Cast(Convert(varchar, Cast(Price as money),1) as…

Bạn có trường Price là trường Numeric (giả sử có giá trị 123456) trong bảng tblProduct. Trong câu lệnh Select bạn muốn in ra giá trị được định dạng là : 123,456 thì dùng câu lệnh như sau

Select

    SubString(Cast(

Convert(varchar,

Cast(Price as money),

1)

                                                                                               as Varchar), 0,

        len(Cast(Convert(varchar, Cast(Price as money),1)

                as Varchar))-2)

        + ‘ VND’ as ProductPrice

    from tblProduct

Enable and Configure FILESTREAM SQL 2016

Nguồn Enable and Configure FILESTREAM

Turn On FileStream Enable by Open SQL Config Tools

SQL Server 2016 C:\Windows\SysWOW64\SQLServerManager13.msc

Chú thích XML cho chương trình viết bằng C#

Mới tham khảo một bài viết khá hay bên ZenSoft về chú thích cho các đoạn code mà chúng ta viết. Giúp chương trình rỏ ràng hơn, dể dàng update hơn khi khối lượng code tăng lên quá lớn. Chú thích XML sẽ mô tả đầy đủ cho lớp hay phương thức như giá trị trả về, mục đích, tài liệu tham khảo, những điều tương tự…

Có 2 loại “Chú Thích” sử dụng với .NET FrameWorks. Loại thông thường nhất là các loại “Chú Thích Dòng” (Bất cứ khi nào bạn sử dụng // với C# để đánh dấu một dòng là Chú Thích.) Loại chú thích này thường được sử dụng để giải thích những gì mà dòng lệnh hiện hành hoặc dòng mã kế tiếp đang thực hiện. Còn loại chú thích thứ 2 chính là chú thích XML. Chú thích này ghi chép tài liệu cho một lớp hoặc phương thức bằng cách sử dụng một phần XML. Ngoài ra, nó còn tạo tài liệu API cho ứng dụng. Sau đây là một ví dụ về các chú thích XML được áp dụng và một phương thức C#.=:

Nói thì nói vậy thôi chứ khi viết thì làm biếng chết được

Visual C# Code:

  1. /// <summary>
  2. /// This method can spilit a String.
  3. /// </summary>
  4. /// <param name=”words”></param>
  5. /// <param name=”ar”></param>
  6. privatestatic void SplitString(string words, ref ArrayList ar)
  7. {
  8.    …
  9. }

Như ta đã thấy trong ví dụ trên, các chú thích XML rất đơn giản – đặt /// trước các lớp, giao diện, phương thức , trường hoặc trước phần khai báo thuộc tính. Visual Studio sẽ tự động tổng kết cơ bản về hàm hoặc phương thức cùng với các tham số đi kèm. Có hơn 20 loại thẻ khác nhau có thể được sử dụng trong các chú thich XML, và được chia làm 2 loại chính.

I. Các Thẻ Chính:

Các Thẻ chính là những thẻ mà bạn sử dụng một cách độc lập với những thẻ khác.

1. <summary>:

Vì nó xuất hiện theo thẻ mặc định, nên có thể nó là thẻ quen nhất trong các loại thẻ. Nó nên được sử dụng để ghi chép mục đích chung nhất của tất cả các phương thức public, thuộc tính và trường của một kiểu.

Visual C# Code:

Select All | Show/Hide

  1. /// <summary>
  2. /// Hàm Đánh dấu một kí tự.
  3. /// </summary>
  4. privatestring MarkKeyword
  5. {
  6. …….
  7. }
  8. <remarks>:

    Thẻ này có ý nghĩa là mô tả một kiểu. Có thể bạn không biết điều này bời vì khi chèn các chú thích XML và trong Visual Studio, nó sẽ chèn thẻ <summary> thay vì chèn thẻ <remarks>. Sự khác biệt không lớn nhưng tài liệu C# đề nghị sử dụng <remarks>. Sau đây là ví dụ về thẻ remarks:

Visual C# Code:

  1. /// <remarks>
  2. /// Hàm Đánh dấu một kí tự.
  3. /// </remarks>
  4. privatestring MarkKeyword
  5. {
  6. ……..
  7. }
  8. <value>:

    Tương tự như 2 thẻ trên, thẻ <value > mô tả giá trị của một thuộc tính. Nó cũng được sử dụng như các thẻ khác:

Visual C# Code:

  1. /// <value>
  2. /// Thuộc tính này số lượng các sách có trong thư viện.
  3. /// </value>
  4. protectedint numberOfBooks;
  5. <param>:

    Thẻ <param> được sử dụng để ghi chép từng tham số của một phương thức. Đây là một trong những chú thích hữu dụng nhát bởi vì đôi khi khó nhận biết mục đích của một tham số chỉ từ tên của nó.

Visual C# Code:

  1. /// <summary>
  2. /// Hàm này để chia một ArrayList thành chuỗi string.
  3. /// </summary>
  4. /// <param name=”words”></param>
  5. /// <param name=”ar”>một danh sách các chủ đề của bài viết.</param>
  6. privatestatic void SplitString(string words, ref ArrayList ar)
  7. {
  8. ……….
  9. }
  10. <returns> :

    Thẻ này được sử dụng để định nghĩa kiểu trả về của một phương thức. Từ chữ ký của phương thức, bạn biết kiểu nào nó trả về. Do đó, việc khai báo kiểu giá trị cho nó là vô ích mà hãy giải thích những gì mà giá trị trả về đó.

Visual C# Code:

  1. /// <summary>
  2. /// Thay thế các ký tự đặc biệt bằng dấu cách
  3. /// </summary>
  4. /// <param name=”s”></param>
  5. /// <returns>Giá trị trả lại là những dấu cách</returns>
  6. privatestatic string ReplaceSpecialChar(string s)
  7. {
  8. stringspecialChar = @”‘-%*”;// Chuỗi ký tự đặc biệt
  9. ……..
  10. returns;
  11. }

  12. <exception> :

    Được sử dụng để xác định các ngoại lệ mà một kiểu có thể đưa ra. Thẻ này sử dụng một thuộc tính được gọi là cref. Thuộc tính cref được sử dụng để tham chiếu một kiểu khác. Bằng cách sử dụng thẻ <exception>, bạn nên ghi chép tất cả những ngoại lệ cụ thể mà phương thức có thể đưa ra bằng thuộc tính cref và sau đó giải thích khi nào ngoại lệ có thể được đưa ra.

Visual C# Code:

  1. /// <exception cref=”Exception”>
  2. /// Có lỗi trong quá trình xử lý
  3. /// </exception>
  4. voidPage_LoadComplete(object sender, EventArgs e)
  5. {
  6. ……..
  7. }

Vậy biết những ngoại lệ nào mà một phương thức có thể đưa ra rất quan trọng đối với việc phát triển các ứng dụng chất lượng cao. Vì .NET không cho bạn xác định những ngoại lệ nào mà phương thức có thể đưa ra trong chữ ký phương thức.

7.<example> :

Với thẻ này, có thể được sử dụng để cung cấp một ví dụ về cách sử dụng phương thức, thuộc tính hoặc trường. các ví dụ là một phần chính của việc ghi chép tài liệu chất lượng cao và không có gì có thể hướng dẫn tốt hơn cho các nhà phát triển cách làm việc với các kiểu của bạn. Bằng cách sử dụng thẻ <example> cùng với thẻ <code> (một trong những thẻ thứ cấp), bạn có thể cung cấp trực tiếp các vi dụ mã trong mã của bạn.

Visual C# Code:

  1. /// <summary>
  2. /// Thay thế các ký tự đặc biệt bằng dấu cách
  3. /// </summary>
  4. /// <param name=”s”></param>
  5. /// <returns></returns>
  6. /// <example>
  7. /// <code>
  8. ///
  9. /// // Chuỗi ký tự đặc biệt
  10. ///
  11. /// string specialChar = @”‘-%*”;
  12. ///
  13. /// // gán các ký tự đặc biệt thành ký tự rỗng.
  14. ///
  15. /// s = s.Replace(specialChar[i], ‘ ‘);
  16. ///
  17. /// </code>
  18. /// </example>
  19. privatestaticstring ReplaceSpecialChar(string s)

Bạn nghĩ sao nếu tài liệu MSDN không có các ví dụ. đó chính mà ví dụ cho sự quan trọng của thẻ <example>.

8.<permission> :

Cho phép bạn xác định ai được phép truy cập kiểu của bạn. Thẻ <permission> cũng có thể chứa thuộc tính cref và hầu như luôn hướng sang System.Security.PermissionSer.

Visual C# Code:

  1. /// <summary>
  2. /// Tạo chuỗi tìm kiếm từ một danh sách các từ khóa cần tìm
  3. /// </summary>
  4. /// <param name=”fieldName”></param>
  5. /// <param name=”keywords”></param>
  6. /// <returns></returns>
  7. /// <permission cref=”System.Security.PermissionSer”>
  8. ///
  9. /// Private Access
  10. ///
  11. /// </permission>
  12. privatestaticstring BuildSQLQuery(string fieldName, ArrayList keywords)
  13. <seealso> :

    Có thể được sử dụng để tham chiếu các lớp khác hoặc những tài liệu vốn có để gây sự chú ý với người đọc tài liệu. Thẻ này cũng có chứa thuộc tính cref và bạn có thể tham chiếu các kiểu, phương thức, thuộc tính hoặc trường khác mà người dùng có thể quan tâm đến.

Visual C# Code:

  1. /// <summary>
  2. /// Tạo chuỗi tìm kiếm từ một danh sách các từ khóa cần tìm
  3. /// </summary>
  4. /// <param name=”fieldName”></param>
  5. /// <param name=”keywords”></param>
  6. /// <returns></returns>
  7. /// <seealso cref=”SetSQLQuery”/>
  8. privatestatic string BuildSQLQuery(string fieldName, ArrayList keywords)
  9. <include> :

    Thẻ này khác với các thẻ chính khác bởi vì nó được sử dụng để bao hàm các chú thích XML bên ngoài trái với việc ghi chép tài liệu cho bất cứ thứ gì. Thẻ <include> có thể hữu dụng nếu các chú thích XML trong các file nguồn ngày càng trở nên lớn và vụng về. Để sử dụng thẻ này, bạn sẽ cần phải sử dụng tên file cũng như biểu thức XPath vốn sẽ được sử dụng để đi đến các chú thích của bạn.

Visual C# Code:

  1. /// <include file=’XMLLib.xml’
  2. /// path=’doc/members/member[@name=”M:XMLLib.Vehicle.Start”]’/>
  3. publicvirtual void Start()
  4. Các thẻ thứ cấp:

    Có thể được sử dụng bên trong các thẻ chính. Những thẻ này được sử dụng để đánh dấu và định dạng Text để đưa vào các thẻ chính. Trong ví dụ về thẻ <example> ta cũng đã biết được thẻ <code> rồi.

    1. Nhập <c> và <code>:

    Các thẻ <c> và <code> đều được sử dụng định nghĩa khi nào một phần Text là mã. Sự khác biệt duy nhất giữa 2 thẻ này là <c> có thể được sử dụng để đánh dấu một điều gì đó là mã nội dòng (jnline) trong một câu khác, trong khi <code> được sử dụng để xác lập toàn bộ một khối Text dưới dạng mã. Có nghĩa là <code> có chứa các ngắt dòng còn <c> thì không.

Visual C# Code:

  1. /// <summary>
  2. /// Thay thế các ký tự đặc biệt bằng dấu cách bằng hàm <c>ReplaceSpecialChar(“a”)</c>
  3. /// </summary>
  4. /// <param name=”s”></param>
  5. /// <returns></returns>
  6. privatestatic string ReplaceSpecialChar(string s)

Nếu bạn muốn cung cấp một ví dụ hoàn chỉnh, thì dùng thẻ <code> sẽ thích hợp hơn.

Visual C# Code:

  1. /// <summary>
  2. /// Thay thế các ký tự đặc biệt bằng dấu cách
  3. /// </summary>
  4. /// <param name=”s”></param>
  5. /// <returns></returns>
  6. /// <example>
  7. /// <code>
  8. ///
  9. /// // Chuỗi ký tự đặc biệt
  10. ///
  11. /// string specialChar = @”‘-%*”;
  12. ///
  13. /// // gán các ký tự đặc biệt thành ký tự rỗng.
  14. ///
  15. /// s = s.Replace(specialChar[i], ‘ ‘);
  16. ///
  17. /// </code>
  18. /// </example>
  19. privatestaticstring ReplaceSpecialChar(string s)

Cả 2 loại thẻ trên nên được sử dụng bất cứ khi nào bạn đưa mã vào các website của mình

2. <para>:

Được sử dụng để chỉ định một đoạn trong các chú thích. Nếu các chú thích dài, bạn nên ngắt nó thành các đoạn để làm cho việc đọc trở nên dễ dàng hơn.

Visual C# Code:

  1. /// <summary>
  2. /// Trong hàm Page_Load này, ta phải làm các công việc sau:
  3. /// <para>
  4. /// Kiểm tra bài viết có tồn tại hay không
  5. /// và chỉ có những người tạo ra bài viết mới được phép sửa bài
  6. /// và xem bài viết đó đã được xuất bản chưa?
  7. /// Nếu chưa sản xuất thì chỉ có người duyệt bài mới được xem
  8. /// </para>
  9. /// </summary>
  10. /// <param name=”sender”></param>
  11. /// <param name=”e”></param>
  12. protectedvoidPage_Load(object sender, EventArgs e)
  13. <paramref > :

    Có thể được sử dụng để tạo một tham chiếu dẫn sang một tham số. Khi mô tả một phương thức, bạn sẽ thường tham một tham số của phương thức. Bằng cách sử dụng thẻ này, công cụ tạo tài liệu có thể xác định tham số nào mà bạn tham chiếu sang và tạo một link giữa 2 tham số trong một tài liệu

Visual C# Code:

  1. /// <summary>
  2. /// hàm tách các ArrayList thành các chuỗi <paramref name=”words”/>
  3. /// </summary>
  4. /// <param name=”words”></param>
  5. /// <param name=”ar”></param>
  6. ///
  7. privatestatic void SplitString(string words, ref ArrayList ar)
  8. <see> :

    Thẻ <see> có thể được sử dụng giống như thẻ <seealso> ngoại trừ bạn sử dụng <see> trong ngữ cảnh của một thẻ khác. Khi bạn muốn liệt kê một số phương thức mà một lớp chứa và sử dụng thẻ <see> để tham chiếu đến những phương thức đó.

Visual C# Code:

  1. /// <remarks>
  2. /// hàm này có nhiều phương thức như <see cref=”GetArticlesByFilter”/>GetArticlesByFilter
  3. /// and <see cref=”UpdatePublish”/>
  4. /// </remarks>
  5. publicclass ArticlesDAO
  6. Các thẻ List :

    Loại thẻ cuối cùng là các thẻ List. Những thẻ này được tạo để sử dụng các List (danh sách). Thẻ <list> được sử dụng để tạo một List và có một thuộc tính gọi là TYPE. Thuộc tính này định nghĩa loại List nào mà bạn đang tạo; giá trị này có thể được thiết lập sang Bullet, number hoặc table. Thẻ <listheader> sau đó có thể được sử dụng để định nghĩa header (Tiêu đề) cho List. Nó có thể chứa các thẻ <term> và <description>. Sau thẻ <listheader>, thẻ <list> có thể chứa bất kỳ số thẻ <item>. Mỗi thẻ <item> tượng trưng cho một mục trong danh sách và có thể bao gồm các thẻ <term> và thẻ <description>. Mỗi mục sẽ luôn chứa một thẻ <description> , nhưng sẽ cần phải chứa thẻ <term> nếu bạn tạo một danh sách định nghĩa.

    Sau đây là một ví dụ về danh sách không định nghĩa:

Visual C# Code:

  1. /// <summary>
  2. /// <remarks>
  3. /// hàm tương tác vói CSDL của đối tượng Article.
  4. /// <list>
  5. ///        <listheader><description>Phương Thức</description></listheader>
  6. ///        <item><description>GetArticlesByFilter</description></item>
  7. ///        <item><description>UpdatePublish</description></item>
  8. ///        <item><description>GetArticlesDynamic</description></item>
  9. /// </list>
  10. /// </remarks>
  11. /// </summary>
  12. publicclassArticlesDAO

Còn đây là ví dụ về danh sách định nghĩa:

Visual C# Code:

  1. /// <summary>
  2. /// Thay thế các ký tự đặc biệt bằng dấu cách
  3. /// </summary>
  4. /// <param name=”s”>chuỗi chứa các ký tự đặc biệt
  5. /// <list>
  6. ///       <listheader>
  7. ///              <term>Số</term><description>ký tự đặc biệt</description>
  8. ///       </listheader>
  9. ///       <item>
  10. ///               <term>1</term><description>ký tự “-“</description>
  11. ///        </item>
  12. ///        <item>
  13. ///                <term>2</term><description>ký tự “%”</description>
  14. ///        </item>
  15. ///        <item>
  16. ///                 <term>3</term><description>ký tự “*”</description>
  17. ///        </item>
  18. ///        <item>
  19. ///                 <term>4</term><description>ký tự “dấy nháy ‘ “</description>
  20. ///        </item>
  21. /// </list>
  22. /// </param>
  23. ///
  24. privatestaticstring ReplaceSpecialChar(string s)

Publish ClickOnce VS 2015 with framework 4.0

Copy dotNetFx40_Full_x86_x64.exe file into folder as picture below.

Used: Win10, VS 2015

Untitled