laika222
8/4/2017 - 7:03 PM

Converting Data, CAST, CONVERT, TRY_CAST, TRY_CONVERT, FORMAT, PARSE.sql

/**************************
CAST AND TRY_CAST
**************************/

/*
CAST - standard way to explicitly converts one data type to another so that you can use one data 
type in ways reserved for other data types (for instance, if you want to concatinate an integer 
with a text string, you can CAST the integer as a string so that it can be concatenated with 
the other string). If the conversion of a row fails, the entire statement will fail.

*/
SELECT CAST(ProductID AS varchar(5)) AS 'ProductID as a varchar data type'
FROM customers1;

/*
TRY_CAST - explicitly converts one data type to another so that you can use one data type in ways 
reserved for other data types (for instance, if you want to concatinate an integer with a text 
string, you can TRY_CAST the integer as a string so that it can be concatenated with the other 
string). If you try with a TRY_CAST, it'll cast what it can and return NULLs for those values that 
can't be converted (if you use CAST and one of the values being CAST won't convert, the entire 
statement will fail and you'll get an error).
*/

SELECT TRY_CAST(ProductID AS varchar(5)) AS 'ProductID as a varchar data type'
FROM customers1;

/**************************
CONVERT AND TRY_CONVERT
**************************/

/*
CONVERT - similar to CAST, but is useful for dates as it has extra options for formatting dates.
Non-standard, only recognized by SQL Server.
*/
SELECT CONVERT(varchar(5), ProductID) AS 'ProductID as a varchar data type'
FROM customers1;

-- Example of CONVERT that uses codes that convert dates (the '126' in the statement below - see the paragraph note at the bottom of this page to see some of the common date format codes you can use). The example SELECTs a date column as-is, SELECTs and CONVERTs as nvarchar, and then SELECTs and CONVERTs as nvarchar in the ISO8601 format that is one of the common date standards
SELECT SellStartDate,
	CONVERT(nvarchar(30), SellStartDate) AS ConvertedDate,
	CONVERT(nvarchar(30), SellStartDate, 126) AS ISO8601FormatDate
FROM customers1

-- CONVERT using VARCHAR type and code 1 will place comma separators into a number (for example, the number 23534.12000 will be returned as 23,534.00)
SELECT *, CONVERT(varchar(20), Amount, 1) AS 'Converted Amount' FROM windowTester 
ORDER BY Territory, SalesPerson

-- TRY_CONVERT
SELECT TRY_CONVERT(varchar(5), ProductID) AS 'ProductID as a varchar data type'
FROM customers1;

/*
Some of the common CONVERT codes you can use to get certain types of dates returned.

CODE, DATA FORMAT RETURNED, (STANDARD)
100,	mon dd yyyy hh:miAM/PM	(Default)
101,	mm/dd/yyyy 	(US)
102,	 yyyy.mm.dd	(ANSI)
103,	 dd/mm/yyyy	(British/French)
104,	dd.mm.yyyy	(German)
105,	 dd-mm-yyyy	(Italian)
106,	dd mon yyyy	
107,	Mon dd, yyyy	
108,	hh:mm:ss	
109,	mon dd yyyy hh:mi:ss:mmmAM (or PM)	(Default + millisec)
110,	mm-dd-yyyy	(USA)
111, yyyy/mm/dd	(Japan)
112,	 yyyymmdd	(ISO)
113,	dd mon yyyy hh:mi:ss:mmm	(Europe (24 hour clock)>)
114,	hh:mi:ss:mmm	(24 hour clock)
120,	yyyy-mm-dd hh:mi:ss	(ODBC canonical (24 hour clock))
121,	yyyy-mm-dd hh:mi:ss.mmm	(ODBC canonical (24 hour clock))
126,	yyyy-mm-ddThh:mi:ss.mmm	(ISO8601)
127,	yyyy-mm-ddThh:mi:ss.mmmZ	(ISO8601 (with time zone Z))
130,	dd mon yyyy hh:mi:ss:mmmAM	(Hijiri)
131,	dd/mm/yy hh:mi:ss:mmmAM	(Hijiri)

*/

/**************************
FORMAT and TRY_FORMAT
**************************/

/*

FORMAT() allows you to format the results, such as changing date types or adding comma separators, 
for viewing in a result set, though you'll take a sizeable performance hit. It's usually best to 
leave the formatting to the client application that will be receiving the data, rather than using
the overhead to convert the data within SQL Server.
*/

-- main query which returns results that are not formatted
SELECT stationname, date, rides
FROM CTARidershipStationDaily
ORDER BY rides DESC, stationname, date

/* Results:

stationname         date                      rides
Belmont-North Main  2015-06-28 00:00:00.000   36323
Belmont-North Main  2012-06-24 00:00:00.000   36017
Lake/State          2016-11-04 00:00:00.000   35845
Belmont-North Main  2011-06-26 00:00:00.000   33795
Addison-North Main  2016-10-29 00:00:00.000   33615

*/

-- example using FORMAT to add a comma separator to the rides column
SELECT stationname, date, FORMAT(rides,'###,###,###') AS 'No Rides'
FROM CTARidershipStationDaily
ORDER BY rides DESC, stationname, date

/* Results:

stationname         date                      No Rides
Belmont-North Main  2015-06-28 00:00:00.000   36,323
Belmont-North Main  2012-06-24 00:00:00.000   36,017
Lake/State          2016-11-04 00:00:00.000   35,845
Belmont-North Main  2011-06-26 00:00:00.000   33,795
Addison-North Main  2016-10-29 00:00:00.000   33,615

*/

-- example showing how you can place any text in the string
SELECT stationname, date, FORMAT(rides,'### <> ### <> ###') AS 'No Rides'
FROM CTARidershipStationDaily
ORDER BY rides DESC, stationname, date

/* Results:

stationname         date                      No Rides
Belmont-North Main  2015-06-28 00:00:00.000   <> 36 <> 323
Belmont-North Main  2012-06-24 00:00:00.000   <> 36 <> 017
Lake/State          2016-11-04 00:00:00.000   <> 35 <> 845
Belmont-North Main  2011-06-26 00:00:00.000   <> 33 <> 795
Addison-North Main  2016-10-29 00:00:00.000   <> 33 <> 615

*/

-- example of formatting the date column as a date with no timestamp. The 'd' tells it to show the date without a leading zero, and 'en-us' tells it to format using the US MM/DD/YYYY format (instead of the usual YYYY/MM/DD)
SELECT stationname, FORMAT(date, 'd', 'en-us') AS 'Date Observed', rides
FROM CTARidershipStationDaily
ORDER BY rides DESC, stationname, date

/* Results:

stationname         Date Observed rides
Belmont-North Main  6/28/2015     36323
Belmont-North Main  6/24/2012     36017
Lake/State          11/4/2016     35845
Belmont-North Main  6/26/2011     33795
Addison-North Main  10/29/2016    33615

*/

-- example of spelling out the date in English, like 'Sunday, June 6, 2015' - 'dddd' tells it to use the full date name (ie 'Sunday'), MMMM tells it to spell out the month ('June'), 'd' tells it to include the date with no leading zero, and 'YYYY' tells it to include the year. 
SELECT stationname, FORMAT(date, 'dddd, MMMM d, yyyy') AS 'Date Observed', rides
FROM CTARidershipStationDaily
ORDER BY rides DESC, stationname, date

/* Results:

stationname         Date Observed               rides
Belmont-North Main  Sunday, June 28, 2015       36323
Belmont-North Main  Sunday, June 24, 2012       36017
Lake/State          Friday, November 4, 2016    35845
Belmont-North Main  Sunday, June 26, 2011       33795
Addison-North Main  Saturday, October 29, 2016  33615

*/

-- you can also use CONVERT to VARCHAR type and code 1 which will place comma separators into a number (for example, the number 23534.12000 will be returned as 23,534.00)
SELECT *, CONVERT(varchar(20), Amount, 1) AS 'Converted Amount' FROM windowTester 
ORDER BY Territory, SalesPerson

/* Results:

SalesPerson Territory SalesYear Amount      Converted Amount
12	        1	        2011	    89333.20	  89,333.20
12	        1	        2012      2393.30     2,393.30
12	        1	        2012      373525.98   373,525.98

*/

/**************************
PARSE AND TRY_PARSE
**************************/
/*
Parse is an alternative to CONVERT when you want to parse a character string input to a target type,
but instead of using format codes like '101', it uses a more user-friendly .NET culture name.
However this is very slow, so normally use should use CONVERT instead.
*/

SELECT PARSE('01/03/2017' AS DATE USING 'en-US')