|
|
#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 |
|
|
|
|
#2 |
|
Консультант-джедай
|
А можно узнать чего Вы пытаетесь добиться? Что мешает скрыть элемент времени?
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога
|
|
|
|
|
#3 |
|
Участник
|
Сейчас, после нн-ого времени проведенного без результатов добился цели именно выгрузкой даты без времени, но хотелось бы какого то единообразия что-ли...
|
|
|
|
|
#4 |
|
Консультант-джедай
|
Я спрашивал про бизнес цель? Если скрыть элемент времени, то пользователям будет все равно какое там значение.
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога
|
|
|
|
|
#5 |
|
Участник
|
Была необходимость импорта данных, реализовывали через SSIS, перед импортом необходимо было проверить на наличие уже существующих записей, для этого использовался лукап, и не сразу пришло в голову конвертировать дату-время в дату при выгрузке, но в итоге на этом остановились.
Но тем не менее, даже учитывая, что задача решена, по какой причине записываются даты с разным временем? Специфика CRM или кривые руки? |
|
|
|
|
#6 |
|
Консультант-джедай
|
до 2016 версии все поля даты/время хранятся в БД в UTC формате. И абсолютно все со временем. То что время убирается из интерфейса это только визуальное отображение. В БД все равно имеется время.
Помимо этого при сохранении даты/времени в БД происходит приведение локального времени текущего пользователя к UTC формату. Т.е. из введенное даты/времени прибавляется или вычитается часовой пояс. А при запросе из БД дата/время снова приводится к локальному времени текущего пользователя. Соответственно, в зависимости от настроек часового пояса разные пользователи могут видеть разную дату/время в одном поле.
__________________
Крокодил, крокожу и буду крокодить. Человек человеку - волк , а зомби зомби - зомби. Экстремал и буду экстремать! Блога
|
|
|
|
|
#7 |
|
Участник
|
|
|
|
|
|
#8 |
|
Чайный пьяница
|
Да. В появились TimeZone independent fields - https://technet.microsoft.com/en-us/...or=-2147217396
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
|
| За это сообщение автора поблагодарили: spectr (1). | |
|
|
#9 |
|
Участник
|
Цитата:
Вы в своей "консольке" безусловно прибавляете к дате 4 часа (она кстати через crm service выгружается тоже в UTC значении) при этом: разница между вашим часовым поясом (москва?) и UTC+0 изза перевода времени на зимнее\летнее может варироваться от 3 до 4 часов в filtered-views вызывается функция fn_UtcToLocalTime(datetime), которая приводит ко времени пользователя из-под кооторого выполняется sql script и дотнет в UtcToLocalTime и срм-ная sql-функция умеют правильно определять автоматически разницу смещения в зависимости от перевода часов. |
|
|
|
|
|