18.01.2016, 12:05 | #1 |
Участник
|
Не получается поставить даты в "0"
Добрый день,
Не совсем уверен, что выбрал правильную тему. Скорее всего подобные вопросы поднимались ранее, но в поиске не нашел, так что прошу сильно не пинать, если что то было. Суть Дела: В СРМ есть дни рождения людей, записанны в беспорядочном формате, т.е. дата и время, время часто разное. написал маленькое приложение, что бы исправить ситуацию: Код: using System; using System.Collections.Generic; using System.Globalization; using Microsoft.Xrm.Client; using Microsoft.Xrm.Client.Services; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; namespace Drop_Dates_To_Zero { class Program { static void Main(string[] args) { var connection = CrmConnection.Parse("Url=http://crm/***/; Domain=***; Username=********; Password=********;"); var service = new OrganizationService(connection); var context = new CrmOrganizationServiceContext(connection); int count = 0; List<Entity> AllPerson = GetAllAccount(service); foreach (var person in AllPerson) { if (person.Attributes.ContainsKey("birthdate")) { var olddate = ((DateTime)person.Attributes["birthdate"]).AddHours(4).Date.ToString(CultureInfo.CurrentCulture); (person.Attributes["birthdate"]) = DateTime.Parse(olddate); context.Update(person); context.SaveChanges(); } count++; Console.Clear(); Console.WriteLine("{0} out of {1} done!", count, AllPerson.Count); } Console.WriteLine("Ok!"); } private static List<Entity> GetAllAccount(IOrganizationService service) { int i = 0; List<Entity> AllAccount = new List<Entity>(); try { var _service = service; int fetchCount = 5000; int pageNumber = 1; List<Guid> dicacc = new List<Guid>(); QueryExpression QE = new QueryExpression(); QE.ColumnSet = new ColumnSet("contactid","fullname","birthdate"); QE.EntityName = "contact"; QE.PageInfo = new PagingInfo(); QE.PageInfo.Count = fetchCount; QE.PageInfo.PageNumber = pageNumber; QE.PageInfo.PagingCookie = null; while (true) { EntityCollection collections = _service.RetrieveMultiple(QE); if (collections.Entities.Count > 0) { foreach (Entity e in collections.Entities) { i++; AllAccount.Add(e); } } if (collections.MoreRecords) { QE.PageInfo.PageNumber++; QE.PageInfo.PagingCookie = collections.PagingCookie; } else { break; } } } catch (Exception ex) { } return AllAccount; } } } Код: select top 10 birthdate from FilteredContact Where birthdate is not null Код: 2008-06-01 00:00:00.000 2008-09-04 00:00:00.000 1971-01-18 01:00:00.000 1985-03-21 01:00:00.000 1972-07-22 00:00:00.000 1988-09-12 00:00:00.000 1988-04-01 00:00:00.000 1988-08-03 00:00:00.000 1978-02-27 01:00:00.000 1975-04-16 00:00:00.000 |
|
18.01.2016, 13:26 | #2 |
Консультант-джедай
|
А можно узнать чего Вы пытаетесь добиться? Что мешает скрыть элемент времени?
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
18.01.2016, 13:34 | #3 |
Участник
|
Сейчас, после нн-ого времени проведенного без результатов добился цели именно выгрузкой даты без времени, но хотелось бы какого то единообразия что-ли...
|
|
18.01.2016, 13:56 | #4 |
Консультант-джедай
|
Я спрашивал про бизнес цель? Если скрыть элемент времени, то пользователям будет все равно какое там значение.
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
19.01.2016, 12:35 | #5 |
Участник
|
Была необходимость импорта данных, реализовывали через SSIS, перед импортом необходимо было проверить на наличие уже существующих записей, для этого использовался лукап, и не сразу пришло в голову конвертировать дату-время в дату при выгрузке, но в итоге на этом остановились.
Но тем не менее, даже учитывая, что задача решена, по какой причине записываются даты с разным временем? Специфика CRM или кривые руки? |
|
19.01.2016, 12:40 | #6 |
Консультант-джедай
|
до 2016 версии все поля даты/время хранятся в БД в UTC формате. И абсолютно все со временем. То что время убирается из интерфейса это только визуальное отображение. В БД все равно имеется время.
Помимо этого при сохранении даты/времени в БД происходит приведение локального времени текущего пользователя к UTC формату. Т.е. из введенное даты/времени прибавляется или вычитается часовой пояс. А при запросе из БД дата/время снова приводится к локальному времени текущего пользователя. Соответственно, в зависимости от настроек часового пояса разные пользователи могут видеть разную дату/время в одном поле.
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога |
|
23.01.2016, 01:40 | #7 |
Участник
|
|
|
23.01.2016, 14:15 | #8 |
Чайный пьяница
|
Да. В появились TimeZone independent fields - https://technet.microsoft.com/en-us/...or=-2147217396
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: spectr (1). |
28.01.2016, 12:46 | #9 |
Участник
|
Цитата:
Вы в своей "консольке" безусловно прибавляете к дате 4 часа (она кстати через crm service выгружается тоже в UTC значении) при этом: разница между вашим часовым поясом (москва?) и UTC+0 изза перевода времени на зимнее\летнее может варироваться от 3 до 4 часов в filtered-views вызывается функция fn_UtcToLocalTime(datetime), которая приводит ко времени пользователя из-под кооторого выполняется sql script и дотнет в UtcToLocalTime и срм-ная sql-функция умеют правильно определять автоматически разницу смещения в зависимости от перевода часов. |
|
|
|