DateOnly 类型bug 返回

SqlSugar 沟通中
4 434
/// <summary>
/// 报价表
/// </summary>
public class Quotation : BaseEntity
{
	/// <summary>
	/// 业务外主键
	/// </summary>
	[SugarColumn(IsPrimaryKey = true)]
	public long Id { get; set; }
	/// <summary>
	/// 供应商Id
	/// </summary>
	[SugarColumn(IsOnlyIgnoreUpdate = true)]
	public long SupplierId { get; set; }
	/// <summary>
	/// 货品Id
	/// </summary>
	[SugarColumn(IsOnlyIgnoreUpdate = true)]
	public long GoodsId { get; set; }
	/// <summary>
	/// 生效日期
	/// </summary>
	public DateOnly TermStart { get; set; }
	/// <summary>
	/// 截止日期
	/// </summary>
	public DateOnly TermEnd { get; set; }
	/// <summary>
	/// 状态
	/// </summary>
	public QuotationStatus Status { get; set; }
}

IEnumerable<Quotation> list = ...
var query = sugarScope.Reportable(list.ToList()).ToQueryable();
var overlist = await sugarScope.Queryable<Quotation>()
					.InnerJoin(query, (l, r) => l.SupplierId == r.SupplierId && l.GoodsId == r.GoodsId && l.TermStart <= r.TermEnd && l.TermEnd >= r.TermStart && l.Status == QuotationStatus.启用 && l.Id != r.Id)
					.ToListAsync();

连表查询时生成的sql:

SELECT `l`.`Id`,`l`.`SupplierId`,`l`.`GoodsId`,`l`.`TermStart`,`l`.`TermEnd`,`l`.`Status`,`l`.`IsDeleted` FROM `Quotation` `l` Inner JOIN ( SELECT  1979003253374980096 AS `Id` , 1831509754221039616 AS `SupplierId` , 1830908054225424384 AS `GoodsId` ,  CAST(N'11/09/2025' AS DATETIME) AS `TermStart` ,  CAST(N'11/30/2025' AS DATETIME) AS `TermEnd` ,null as NoCacheColumn
       UNION ALL
       SELECT  1985188292718628864 AS `Id` , 1831509754221039616 AS `SupplierId` , 1927917954545094656 AS `GoodsId` ,  CAST(N'11/09/2025' AS DATETIME) AS `TermStart` ,  CAST(N'11/30/2025' AS DATETIME) AS `TermEnd` ,null as NoCacheColumn
      ) `r`  ON (((((( `l`.`SupplierId` = `r`.`SupplierId` ) AND ( `l`.`GoodsId` = `r`.`GoodsId` )) AND ( `l`.`TermStart` <= `r`.`TermEnd` )) AND ( `l`.`TermEnd` >= `r`.`TermStart` )) AND ( `l`.`Status` = @Status0 )) AND ( `l`.`Id` <> `r`.`Id` ))  WHERE( `l`.`IsDeleted` = @IsDeleted101 )

DateOnly 类型 变成了 

CAST(N'11/09/2025' AS DATETIME) AS `TermStart`

导致 查询为空
如果改为这种写法 就能查询到数据

CAST(N'2025/11/09' AS DATETIME) AS `TermStart`

原因好像是日期格式问题 
为什么生成sql 的时候 DateOnly 会 按 “月/日/年”来生成,有什么办法能变为 年/月/日
或者 有什么设置让mysql 正确比较 不同格式的日期数据

热忱回答4

  • fate sta fate sta VIP0
    2025/11/14

    我处理一下,报表查询dateonly

    0 回复
  • @fate sta:有应急方法吗

    0 回复
  • @老菜鸟了:用原生sql 模拟 Reportable 应急了

    var sql = new StringBuilder("select l.Id from Quotation l inner join (");
    bool isFirst = true;
    foreach (var item in list)
    {
    	if (!isFirst)
    	{
    		sql.Append(" union all ");
    	}
    	sql.Append($"select {item.SupplierId} as SupplierId,{item.GoodsId} as GoodsId,'{item.TermStart:yyyy/MM/dd}' as TermStart,'{item.TermEnd:yyyy/MM/dd}' as TermEnd");
    	if (hasID)
    		sql.Append($",{item.Id} as Id");
    	isFirst = false;
    }
    sql.Append(") r on l.SupplierId=r.SupplierId and l.GoodsId=r.GoodsId and l.TermStart <= r.TermEnd and l.TermEnd >= r.TermStart");
    if (hasID)
    	sql.Append(" and l.Id != r.Id");
    sql.Append(" where l.Status = 0");
    var overlist = await sugarScope.SqlQueryable<ViewQuotationId>(sql.toString()).ToListAsync();


    0 回复
  • SqlSugarCore 5.1.4.208-preview25


    过五分钟后,安装到预览版本。

    0 回复