We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

CAST DATETIME2 to DATETIME

Medium Priority
11,384 Views
Last Modified: 2012-05-07
I am having the worst time with this... lord knows what I'm missing.
v2008,  have a very critical solution driven procedurally across the data layer.  it traverses mutliple servers, basically doing reconcilation on demand.  if/when it is needed, it is business critical.  

recently i began upgrading my v2000 servers to v2008.  I'm about half way there -- so this reconciliation logic traverses both v2000 and v2008.  

one of the ups of v2008, of course, is the improved precision with DATETIME2.   my v2008 databases are using DATETIME2 in the timefield.  in retrospect, I should have left it at DATETIME until all my boxes were upgraded.  then i could have converted.

for the most part, there are no problems with the new datetime datatype.  invisibile to the front end.   but it's becoming a problem with this reconciliation solution.  here's the short story

- i create a discrepancy  (basically, delete a trade)
- i then run my finder proc, it finds it, and attempts to write it into a working table
- that write fails with 'Syntax error converting datetime from character string.'
- the datasource in this particular scenario is v2008, the timefield is DATETIME2
- the working table within which this write fails is DATETIME.  i cannot change it, however, because that box is still v2000.  

i MUST have a workaround like yesterday.  whatever workaround i put into place is only temporary --- it will not be an issue when the upgrade is complete.  the timefield in question will be DATETIME2 across the board.

in between now and then, is there not an easy way to strip those last three digits off my datestring and pump it from v2008 DATETIME2 into v2000 DATETIME?

i want this:   2009-07-09 08:45:00.0000000
to be this:   2009-07-09 08:45:00.000

how the heck hard can that be.  
i tried the code below, it returns properly in the select, but every insert from v2008 DATETIME2 into v2000 DATETIME fails w/the error:
'Syntax error converting datetime from character string.'

seriously important.  any input is greatly appreciated
IF(@start IS NULL)
DECLARE @start2 DATETIME
SELECT @start2 = MAX(timefield) FROM v2008Server.database.dbo.table 
SET @start = @start2

Open in new window

Comment
Watch Question

Raja Jegan RSQL Server DBA & Architect, EE Solution Guide
CERTIFIED EXPERT
Awarded 2009
Distinguished Expert 2019

Commented:
>> in between now and then, is there not an easy way to strip those last three digits off my datestring and pump it from v2008 DATETIME2 into v2000 DATETIME?

Have you tried converting from Datetime2 to datetime like given below:

CONVERT(DATETIME, datetime2_column, 101)

Hope this would help you truncate the additional values.
Kevin CrossChief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011

Commented:
Just note that the range of dates between the two data types is also different aside from increased precision in milliseconds.  Therefore, if you have a date outside the range, the conversion may fail.

Can probably leave off code and use like this BTW:

CONVERT(DATETIME, datetime2_column)

Author

Commented:
rrjegan17, this fails w/the same syntax error.
mwvisa1, same failure.

i'm just running this against the v2008 dataset:

SELECT CONVERT(DATETIME, timefield)
FROM v2008Server.database.dbo.table WHERE....

i'm not even trying to insert it right now.  just the select fails.
the select without the convert is fine, of course.  

Author

Commented:
i do not want to roll back the DATETIME2 in the v2008 instances.  but if i can't get around this, i don't see another option

Author

Commented:
this works in the select:
select convert(varchar(23),timefield,121)

not sure if it will work in the actual insertion yet

isn't there a better way to do this?
Chief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011
Commented:
Unlock this solution and get a sample of our free trial.
(No credit card required)
UNLOCK SOLUTION
Chris LuttrellSenior Database Architect
CERTIFIED EXPERT

Commented:
What does this produce when run on the SQL2000 box?

SELECT TOP 1 timefield, substring(timefield, 1 , 23)
FROM v2008Server.database.dbo.table

If the substring just shows a '2009-07-09 08:45:00.000' format then try that.

Author

Commented:
that does work, mwvisa1.  select and insertion
query.... that should be fine whether the source is v2008 and destination is v2000, or the opposite, don't you think?

basically, until they're all upgraded, i want one piece of code to work across the board.  one workaround, i guess.   this should do it, regardless of where they're writing to, don't you think?
Kevin CrossChief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011

Commented:
Should work both ways, as you can always do this going the other way to maintain datetime2 on the SQL 2008 side:

select convert(datetime2, convert(varchar(23),timefield,121), 121)

Author

Commented:
excellent.  very big thank you, mwvisa1.  
Kevin CrossChief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011

Commented:
You are welcome.

Happy coding!

Best regards,
Kevin
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a sample view!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.