Skip to content

Commit

Permalink
[fix]在时间日期类型字段中,sqlserver只有datetime2支持微秒。fix: #27
Browse files Browse the repository at this point in the history
  • Loading branch information
nnhy committed Jun 2, 2024
1 parent e6cc3cd commit 2db630c
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 30 deletions.
16 changes: 13 additions & 3 deletions XCode/DataAccessLayer/Common/DbBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -640,7 +640,17 @@ public virtual SelectBuilder PageSplit(SelectBuilder builder, Int64 startRowInde
/// </remarks>
/// <param name="dateTime">时间值</param>
/// <returns></returns>
public virtual String FormatDateTime(DateTime dateTime)
public virtual String FormatDateTime(DateTime dateTime) => FormatDateTime(null!, dateTime);

/// <summary>格式化时间为SQL字符串</summary>
/// <remarks>
/// 优化DateTime转为全字符串,平均耗时从25.76ns降为15.07。
/// 调用非常频繁,每分钟都有数百万次调用。
/// </remarks>
/// <param name="column">字段</param>
/// <param name="dateTime">时间值</param>
/// <returns></returns>
public virtual String FormatDateTime(IDataColumn column, DateTime dateTime)
{
if (dateTime.Ticks % 10_000_000 == 0)
return $"'{dateTime:yyyy-MM-dd HH:mm:ss}'";
Expand Down Expand Up @@ -810,7 +820,7 @@ public virtual String FormatValue(IDataColumn column, Object? value)

if (isNullable && (dt <= DateTime.MinValue || dt >= DateTime.MaxValue)) return "null";

return FormatDateTime(dt);
return FormatDateTime(column!, dt);
}
else if (type == typeof(Boolean))
{
Expand Down Expand Up @@ -864,7 +874,7 @@ public virtual String FormatLike(IDataColumn column, String format, String value
/// <param name="column">字段</param>
/// <param name="format">格式化字符串</param>
/// <returns></returns>
public virtual String FormatLike(IDataColumn column, String format)
public virtual String FormatLike(IDataColumn column, String format)
=> String.Format(format, FormatName(column), FormatParameterName(column.ColumnName));

/// <summary>格式化参数名</summary>
Expand Down
17 changes: 12 additions & 5 deletions XCode/DataAccessLayer/Common/IDatabase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -148,11 +148,6 @@ public interface IDatabase : IDisposable2
/// <summary>长文本长度</summary>
Int32 LongTextLength { get; }

/// <summary>格式化时间为SQL字符串</summary>
/// <param name="dateTime">时间值</param>
/// <returns></returns>
String FormatDateTime(DateTime dateTime);

/// <summary>格式化名称,如果不是关键字,则原样返回</summary>
/// <param name="name">名称</param>
/// <returns></returns>
Expand All @@ -175,12 +170,24 @@ public interface IDatabase : IDisposable2
/// <returns></returns>
String FormatValue(IDataColumn column, Object? value);

/// <summary>格式化时间为SQL字符串</summary>
/// <param name="dateTime">时间值</param>
/// <returns></returns>
String FormatDateTime(DateTime dateTime);

/// <summary>格式化时间为SQL字符串</summary>
/// <param name="column">字段</param>
/// <param name="dateTime">时间值</param>
/// <returns></returns>
String FormatDateTime(IDataColumn column, DateTime dateTime);

/// <summary>格式化模糊搜索的字符串。处理转义字符</summary>
/// <param name="column">字段</param>
/// <param name="format">格式化字符串</param>
/// <param name="value">数值</param>
/// <returns></returns>
String FormatLike(IDataColumn column, String format, String value);

/// <summary>(参数化)格式化模糊搜索的字符串。处理转义字符</summary>
/// <param name="column">字段</param>
/// <param name="format">格式化字符串</param>
Expand Down
3 changes: 2 additions & 1 deletion XCode/DataAccessLayer/Database/Access.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,10 @@ public override String FormatName(String name)
}

/// <summary>格式化时间为SQL字符串</summary>
/// <param name="column">字段</param>
/// <param name="dateTime">时间值</param>
/// <returns></returns>
public override String FormatDateTime(DateTime dateTime) => $"#{dateTime:yyyy-MM-dd HH:mm:ss.fff}#";
public override String FormatDateTime(IDataColumn column, DateTime dateTime) => $"#{dateTime:yyyy-MM-dd HH:mm:ss.fff}#";

/// <summary>格式化关键字</summary>
/// <param name="keyWord">关键字</param>
Expand Down
15 changes: 8 additions & 7 deletions XCode/DataAccessLayer/Database/DB2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,19 +138,20 @@ public override SelectBuilder PageSplit(SelectBuilder builder, Int64 startRowInd

#region 数据库特性
/// <summary>已重载。格式化时间</summary>
/// <param name="dt"></param>
/// <param name="column">字段</param>
/// <param name="dateTime">时间值</param>
/// <returns></returns>
public override String FormatDateTime(DateTime dt)
public override String FormatDateTime(IDataColumn column, DateTime dateTime)
{
if (dt.Ticks % 10_000_000 == 0)
if (dateTime.Ticks % 10_000_000 == 0)
{
if (dt.Hour == 0 && dt.Minute == 0 && dt.Second == 0)
return $"To_Date('{dt:yyyy-MM-dd}', 'YYYY-MM-DD')";
if (dateTime.Hour == 0 && dateTime.Minute == 0 && dateTime.Second == 0)
return $"To_Date('{dateTime:yyyy-MM-dd}', 'YYYY-MM-DD')";
else
return $"To_Date('{dt:yyyy-MM-dd HH:mm:ss}', 'YYYY-MM-DD HH24:MI:SS')";
return $"To_Date('{dateTime:yyyy-MM-dd HH:mm:ss}', 'YYYY-MM-DD HH24:MI:SS')";
}

return $"To_Date('{dt:yyyy-MM-dd HH:mm:ss.fffffff}', 'YYYY-MM-DD HH24:MI:SS.FF')";
return $"To_Date('{dateTime:yyyy-MM-dd HH:mm:ss.fffffff}', 'YYYY-MM-DD HH24:MI:SS.FF')";
}

public override String FormatValue(IDataColumn field, Object? value)
Expand Down
15 changes: 8 additions & 7 deletions XCode/DataAccessLayer/Database/Oracle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -163,19 +163,20 @@ public override SelectBuilder PageSplit(SelectBuilder builder, Int64 startRowInd
#region 数据库特性

/// <summary>已重载。格式化时间</summary>
/// <param name="dt"></param>
/// <param name="column">字段</param>
/// <param name="dateTime">时间值</param>
/// <returns></returns>
public override String FormatDateTime(DateTime dt)
public override String FormatDateTime(IDataColumn column, DateTime dateTime)
{
if (dt.Ticks % 10_000_000 == 0)
if (dateTime.Ticks % 10_000_000 == 0)
{
if (dt.Hour == 0 && dt.Minute == 0 && dt.Second == 0)
return $"To_Date('{dt:yyyy-MM-dd}', 'YYYY-MM-DD')";
if (dateTime.Hour == 0 && dateTime.Minute == 0 && dateTime.Second == 0)
return $"To_Date('{dateTime:yyyy-MM-dd}', 'YYYY-MM-DD')";
else
return $"To_Date('{dt:yyyy-MM-dd HH:mm:ss}', 'YYYY-MM-DD HH24:MI:SS')";
return $"To_Date('{dateTime:yyyy-MM-dd HH:mm:ss}', 'YYYY-MM-DD HH24:MI:SS')";
}

return $"To_Date('{dt:yyyy-MM-dd HH:mm:ss.fffffff}', 'YYYY-MM-DD HH24:MI:SS.FF')";
return $"To_Date('{dateTime:yyyy-MM-dd HH:mm:ss.fffffff}', 'YYYY-MM-DD HH24:MI:SS.FF')";
}

public override String FormatValue(IDataColumn field, Object? value)
Expand Down
16 changes: 12 additions & 4 deletions XCode/DataAccessLayer/Database/SqlServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -394,14 +394,22 @@ public static String PageSplitMaxMin(String sql, Int64 startRowIndex, Int64 maxi
public override Int32 LongTextLength => 4000;

/// <summary>格式化时间为SQL字符串</summary>
/// <param name="column">字段</param>
/// <param name="dateTime">时间值</param>
/// <returns></returns>
public override String FormatDateTime(DateTime dateTime)
public override String FormatDateTime(IDataColumn column, DateTime dateTime)
{
if (dateTime.Ticks % 10_000_000 == 0)
return $"{{ts'{dateTime:yyyy-MM-dd HH:mm:ss}'}}";
else
{
if (dateTime.Hour == 0 && dateTime.Minute == 0 && dateTime.Second == 0)
return $"{{ts'{dateTime:yyyy-MM-dd}'}}";
else
return $"{{ts'{dateTime:yyyy-MM-dd HH:mm:ss}'}}";
}
else if (column != null && !column.RawType.EqualIgnoreCase("datetime2"))
return $"{{ts'{dateTime:yyyy-MM-dd HH:mm:ss.fffffff}'}}";
else
return $"{{ts'{dateTime:yyyy-MM-dd HH:mm:ss.fff}'}}";
}

/// <summary>格式化名称,如果是关键字,则格式化后返回,否则原样返回</summary>
Expand Down Expand Up @@ -465,7 +473,7 @@ public override String FormatValue(IDataColumn field, Object? value)

if (isNullable && (dt <= DateTime.MinValue || dt >= DateTime.MaxValue)) return "null";

return FormatDateTime(dt);
return FormatDateTime(field!, dt);
}

return base.FormatValue(field, value);
Expand Down
3 changes: 2 additions & 1 deletion XCode/DataAccessLayer/Database/TDengine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,10 @@ public override String FormatValue(IDataColumn field, Object? value)
/// 优化DateTime转为全字符串,平均耗时从25.76ns降为15.07。
/// 调用非常频繁,每分钟都有数百万次调用。
/// </remarks>
/// <param name="column">字段</param>
/// <param name="dateTime">时间值</param>
/// <returns></returns>
public override String FormatDateTime(DateTime dateTime)
public override String FormatDateTime(IDataColumn column, DateTime dateTime)
{
if (dateTime.Ticks % 10_000_000 == 0)
return $"'{dateTime:yyyy-MM-dd HH:mm:ss}'";
Expand Down
4 changes: 2 additions & 2 deletions XCode/DataAccessLayer/MetaData/DbMetaData_Negative.cs
Original file line number Diff line number Diff line change
Expand Up @@ -569,7 +569,7 @@ protected virtual String RebuildTable(IDataTable entitytable, IDataTable dbtable
if (sbName.Length > 0) sbName.Append(", ");
if (sbValue.Length > 0) sbValue.Append(", ");
sbName.Append(fname);
sbValue.Append(db.FormatDateTime(DateTime.MinValue));
sbValue.Append(db.FormatDateTime(item, DateTime.MinValue));
}
else if (type == typeof(Boolean))
{
Expand Down Expand Up @@ -598,7 +598,7 @@ protected virtual String RebuildTable(IDataTable entitytable, IDataTable dbtable
type == typeof(Single) || type == typeof(Double) || type == typeof(Decimal) || type != null && type.IsEnum)
sbValue.Append($"ifnull({fname}, 0)");
else if (type == typeof(DateTime))
sbValue.Append($"ifnull({fname}, {db.FormatDateTime(DateTime.MinValue)})");
sbValue.Append($"ifnull({fname}, {db.FormatDateTime(field, DateTime.MinValue)})");
else if (type == typeof(Boolean))
sbValue.Append($"ifnull({fname}, {db.FormatValue(item, false)})");
else
Expand Down

0 comments on commit 2db630c

Please sign in to comment.