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)
SELECT @start2 = MAX(timefield) FROM v2008Server.database.dbo.table 
SET @start = @start2

Open in new window

LVL 17
Who is Participating?
Kevin CrossConnect With a Mentor Chief Technology OfficerCommented:
That should work as the issue is probably the extra digits of precision on datetime2 aren't allowing it to be parsed correctly.

Try this to verify.  If works, should work on insert too.

select convert(datetime, convert(varchar(23),timefield,121), 121)
Raja Jegan RSQL Server DBA & ArchitectCommented:
>> 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 OfficerCommented:
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)
A proven path to a career in data science

At Springboard, we know how to get you a job in data science. With Springboard’s Data Science Career Track, you’ll master data science  with a curriculum built by industry experts. You’ll work on real projects, and get 1-on-1 mentorship from a data scientist.

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

i'm just running this against the v2008 dataset:

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.  
dbaSQLAuthor 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
dbaSQLAuthor 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?
Chris LuttrellSenior Database ArchitectCommented:
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.
dbaSQLAuthor 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 OfficerCommented:
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)
dbaSQLAuthor Commented:
excellent.  very big thank you, mwvisa1.  
Kevin CrossChief Technology OfficerCommented:
You are welcome.

Happy coding!

Best regards,
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.