-- Database by Doug -- Douglas Kline -- 10/10/2018 -- CAST - converting to a new data type -- sometimes you need to change one data type to another data type -- consider this: SELECT '4.0' -- I might want to deal with this as a number -- for example SELECT '4.0' + 2.0 -- this works -- even though they '4.0' is a varchar -- and 2.0 is a floating point number -- the db does an *implicit* conversion -- of the '4.0' to a floating point -- then does the addition -- and returns a floating point -- we hope the db "knows what I mean" -- and are *assuming* it ends up doing the right thing -- for simple things, this mostly works -- the db is pretty smart -- however, high quality code doesn't normally -- make assumptions, so let's be *explicit* SELECT CAST('4.0' AS float) + 2.0 -- here, I'm using the CAST function to -- *explicitly* change a varchar to a float -- I'm not relying on the db "knowing what I mean" -- you can generally CAST between data types -- fairly freely -- see the full matrix of allowable conversions -- for SQL Server 17 -- here: https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-conversion-database-engine?view=sql-server-2017 -- note that some to/from conversions are implicit / automatic -- some are not allowed at all -- and some require explicit CASTs -- here are a few common conversions you might want to do -- converting numeric and dates to varchars -- especially when needing to concatenat SELECT 'Doug' + 1 AS [trying for Doug1] SELECT 1 + 'Doug' AS [trying for 1Doug] -- and the fixes SELECT 'Doug' + CAST(1 AS VARCHAR) SELECT CAST(1 AS VARCHAR) + 'Doug' SELECT GETDATE() + 'Doug' -- error SELECT CAST(GETDATE() AS VARCHAR) + 'Doug' -- forcing specific types of operations -- consider this SELECT 3 / 2 -- notice that I get *integer* division -- because both operands are integers -- but what if I want to see 1.5 as the result? -- I can fix literals easy enough SELECT 3.0 / 2.0 -- but what about this: SELECT UnitsInStock / unitsonorder FROM Products WHERE unitsOnorder <> 0 -- I'm getting integer division -- here's how to get floating point division: SELECT CAST(UnitsInStock AS FLOAT) / CAST(unitsonorder AS FLOAT) FROM Products WHERE unitsOnorder <> 0 -- another common conversion is from varchar to date/time -- see the differences here: SELECT '4/8/2018' SELECT CAST('4/8/2018' AS DATE) SELECT CAST('4/8/2018' AS DATETIME2) -- and here: SELECT '20180408 11:00' SELECT CAST('20180408 11:00' AS DATE) SELECT CAST('20180408 11:00' AS DATETIME2) -- summary -- for 'throw-away' code, the db will implicitly convert -- for high quality code in a system -- you should not rely on implicit conversions -- instead, use CAST -- Database by Doug -- Douglas Kline -- 10/10/2018 -- CAST - converting to a new data type
Monday, October 15, 2018
Using the CAST() function in SQL
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment