18 января 2019 г. в 13:43 На данный момент вам нужны два индекса, чтобы покрыть основное правило ОБА левому и правому объектам JOIN = нужен индекс. 1. ALTER TABLE tbl_workermap ДОБАВИТЬ ИНДЕКС idx_t_w_map_job_id (job_id) 2. ALTER TABLE tbl_workermap ДОБАВИТЬ ИНДЕКС idx_t_w_map_wrk_user_id (worker_user_id) после создания, запустить EXPLAIN ..... для просмотра нового плана выполнения.
Существует перегрузка XPathExpression. Addsort, который берет интерфейс IComparer. При реализации сравнения сами как IComparer Вы могли бы использовать этот механизм.
class Program
{
static void Main(string[] args)
{
XPathDocument saleResults = new XPathDocument( @"salesData.xml" );
XPathNavigator navigator = saleResults.CreateNavigator( );
XPathExpression selectExpression = navigator.Compile( "sales/item" );
XPathExpression sortExpr = navigator.Compile("@sTime");
selectExpression.AddSort(sortExpr, new DateTimeComparer());
XPathNodeIterator nodeIterator = navigator.Select( selectExpression );
while ( nodeIterator.MoveNext( ) )
{
string checkMe = nodeIterator.Current.Value;
}
}
public class DateTimeComparer : IComparer
{
public int Compare(object x, object y)
{
DateTime dt1 = DateTime.Parse( x.ToString( ) );
DateTime dt2 = DateTime.Parse( y.ToString( ) );
return dt1.CompareTo( dt2 );
}
}
}
Вот:
XmlDocument myDoc = new XmlDocument();
myDoc.LoadXml(@"
<sales>
<item name=""Games""
sku=""MIC28306200""
iCat=""28""
sTime=""11/26/2008 8:41:12 AM""
price=""1.00""
desc=""Item Name"" />
<item name=""Games""
sku=""MIC28307100""
iCat=""28""
sTime=""11/26/2008 8:42:12 AM""
price=""1.00""
desc=""Item Name"" />
</sales>
");
var sortedItems = myDoc.GetElementsByTagName("item").OfType<XmlElement>()
.OrderBy(item => DateTime.ParseExact(item.GetAttribute("sTime"), "MM/dd/yyyy h:mm:ss tt", null));
foreach (var item in sortedItems)
{
Console.WriteLine(item.OuterXml);
}
Это - Консольное приложение, которое работает отлично.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="sales"> <sales> <xsl:for-each select="item"> <xsl:sort select="substring(@sTime,7,4)" data-type="number"/> <xsl:sort select="substring(@sTime,1,2)" data-type="number"/> <xsl:sort select="substring(@sTime,4,2)" data-type="number"/> <xsl:sort select="substring-after(substring-after(@sTime,' '),' ')" /> <xsl:sort data-type="number" select= "translate( substring-before(substring-after(@sTime,' '),' '), ':', '' ) " /> <xsl:copy-of select="."/> </xsl:for-each> </sales> </xsl:template> </xsl:stylesheet>
Когда это преобразование применяется на следующий XML-документ:
<sales> <item name="Games" sku="MIC28306200" iCat="28" sTime="11/26/2008 8:41:12 PM" price="1.00" desc="Item Name" /> <item name="Games" sku="MIC28307100" iCat="28" sTime="11/26/2008 8:42:12 AM" price="1.00" desc="Item Name" /> <item name="Games" sku="MIC28307100" iCat="28" sTime="11/26/2008 11:42:12 AM" price="1.00" desc="Item Name" /> <item name="Games" sku="MIC28306200" iCat="28" sTime="12/23/2008 8:41:12 PM" price="1.00" desc="Item Name" /> <item name="Games" sku="MIC28307100" iCat="28" sTime="12/23/2008 8:42:12 AM" price="1.00" desc="Item Name" /> </sales>
к корректному результату приводят:
<sales> <item name="Games" sku="MIC28307100" iCat="28" sTime="11/26/2008 8:42:12 AM" price="1.00" desc="Item Name"/> <item name="Games" sku="MIC28307100" iCat="28" sTime="11/26/2008 11:42:12 AM" price="1.00" desc="Item Name"/> <item name="Games" sku="MIC28306200" iCat="28" sTime="11/26/2008 8:41:12 PM" price="1.00" desc="Item Name"/> <item name="Games" sku="MIC28307100" iCat="28" sTime="12/23/2008 8:42:12 AM" price="1.00" desc="Item Name"/> <item name="Games" sku="MIC28306200" iCat="28" sTime="12/23/2008 8:41:12 PM" price="1.00" desc="Item Name"/> </sales>
То, что Вы пытаетесь сделать, выполняется намного более легко, если XML правильно создается. В рекомендации XML-схемы говорится, что дата/временные стоимости должна быть представлена в формате ISO8601, т.е. CCCC-MM-DD HH:MM:SS
. (На самом деле XML-схема хочет, чтобы разделитель между датой и временем был T, и в данный момент я не помню почему.)
Два основных преимущества форматирования дат и времени этот путь:
Это - жестокость по отношению к датам формата любой другой путь в XML, это будет обработанным XSLT.
Достаточно легко заставить.NET испустить значения DateTime в этом формате (используйте "s" спецификатор формата, который обозначает - ожидают его - "поддающийся сортировке").
предположим, что ваша дата и время в этом формате
2010-06-01T15: 16: 29 + 05: 00
, тогда самый простой способ сделать это
В DATETIME ПРОСТО ЗАМЕНИТЕ ДОПОЛНИТЕЛЬНЫЕ СИМВОЛЫ в моем формате даты и времени у меня есть дополнительные символы (- T: и +), поэтому просто замените их И ТОГДА ВАША ДАТА ВРЕМЯ БУДЕТ В НОМЕРАХ, КОТОРЫЕ МОЖНО ЛЕГКО СОРТИРОВАТЬ