Data Truncation: Truncated Incorrect DOUBLE Value When Updating Timestamp
Posted February 18, 2009 at 3:04 PM
I just spent the last hour trying to debug the smallest SQL problem! I have a datatable of Contracts and I was building a feature in our client software where we could end all contracts of a certain type (SLA) at the same time (trust me, there is a business reason behind this). To do this, I was executing the following MySQL Cross-Table UPDATE statement:
Launch code in new window » Download code as text file »
- UPDATE
- contract c
- INNER JOIN
- contract_type t
- ON
- (
- t.reference_key = 'SLA'
- AND
- c.contract_type_id = t.id
- )
- SET
- c.date_updated = <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp" />
- AND
- c.date_ended = <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp" />
- WHERE
- c.date_ended IS NULL
I'm trying to set the date_ended field to Now() where ever it is currently NULL and of the correct contract type (SLA). However, when I ran this query, MySQL kept throwing this error:
Data truncation: Truncated incorrect DOUBLE value: '2009-02-18 13:43:35'
The error certainly wants you to believe that this is a data problem. Specifically, the error wants you to believe that the date/time value you are using in the query is somehow being converted to a double and that the converted value is too big for a double. So naturally, that's what I was trying to debug. But, after a solid hour, no joke, I came to realize that this error has nothing to do with data at all and is, in fact, a syntax error!
Look at my SET statement:
Launch code in new window » Download code as text file »
- SET
- c.date_updated = <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp" />
- AND
- c.date_ended = <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp" />
See the problem now? I have it written out like a WHERE statement; a proper SET statement uses commas, not ANDs. Rewritten properly, the query is:
Launch code in new window » Download code as text file »
- UPDATE
- contract c
- INNER JOIN
- contract_type t
- ON
- (
- t.reference_key = 'SLA'
- AND
- c.contract_type_id = t.id
- )
- SET
- c.date_updated = <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp" />,
- c.date_ended = <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp" />
- WHERE
- c.date_ended IS NULL
So yeah, that's an hour of my life I won't get back. That's a really poor error that MySQL is throwing. Not that I'm blaming MySQL - I was the one who wrote the crappy statement - but, it did sort of lead me on a wild goose chase. Next time, thought, I'll be prepared!
Download Code Snippet ZIP File
Post Comment | Ask Ben | Permalink | Other Searches | Print Page
Newer Post
Ask Ben: Parsing CSV Strings With Javascript Exec() Regular Expression Command
Older Post
Ask Ben: Automatically Generating Remote CFC Proxies In Javascript
Reader Comments
Good thing that you have your own company. If you worked for someone they might have ripped you for "wasting" an hour.
Those bugs are so much fun.
@Brandon,
Hey, I was still doing client work :)
Just curious. Why did you write out:
c.date_ended = <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp" />
When MySQL has a built in "now()" function. Would it be cleaner (and a mirco-fraction faster) if you did this:
c.date_ended = now()
I imagine you have your reasons.
(Like:
To keep the SQL cross DB compliant
DB server isn't in same timezone as Webserver
)
@Tim,
I just use it out of habit. I like to keep the SQL as consistent as possible and so I use CFQueryParam for ally my dynamic value. Plus, sometimes I have dates that have to be null based on other values and CFQueryParam makes that wicked easy:
<cfqueryparam value="#FORM.date_started#" type="cf_sql_timestamp" null="#(NOT IsDate( FORM.date_started ))#" />
With this, I can put my null-ify logic right into the CFQueryParam tag and keep my SQL free of CFIF statements regarding NULL inserts.
WOW. I just did the same thing! I actually spent a couple hours trying to figure this out :(
@Chuck,
Yeah, the error message is SOOOO misleading!
Whahaha. You just saved me an hour ;)
@Jrgns,
No problem my man :) It's a horribly unhelpful error message, so glad to help.
GOD!
same mistake here.
the error message REALLY HELPED(in making debugging more complex I mean:P)
Thanks for that one Ben :)
Wow, you just saved me an hour. Thanks.
Thanks man, saved me an hour for sure...will remember this one for a long time.
Thanks very much!Actually you saved me an hour.and thanks you one hour.
Glad to help out guys.
Just saved me a morning of frustration too!
Thanks!




