解决ClickHouse 批量更新DateTime问题

This commit is contained in:
Daily 2024-05-30 11:27:49 +08:00
parent 54e1ed6fdb
commit 9aef33e3df
3 changed files with 41 additions and 20 deletions

View File

@ -22,7 +22,7 @@ namespace FreeSql.Tests.ClickHouse
_fsql = new FreeSqlBuilder().UseConnectionString(DataType.ClickHouse,
"Host=192.168.1.123;Port=8123;Database=test_issue;Compress=True;Min Pool Size=1")
.UseMonitorCommand(cmd => _output.WriteLine($"线程:{cmd.CommandText}\r\n"))
.UseNoneCommandParameter(true)
.UseNoneCommandParameter(false)
.UseAdoConnectionPool(true)
.Build();
}
@ -32,25 +32,35 @@ namespace FreeSql.Tests.ClickHouse
[Fact]
public void TestIssue1813()
{
//var personsUpdate = new List<Person>
//{
// new Person
// {
// Id = 1,
// Name = $"test2{DateTime.Now.Millisecond}",
// Age = 20,
// CreateTime = DateTime.Now
// },
// new Person
// {
// Id = 2,
// Name = "test3"+ 286,
// Age = 22,
// CreateTime = DateTime.Now
// }
//};
//普通修改
_fsql.Update<Person>()
.Set(p => p.Name == "update_name")
.Set(p => p.UpdateTime == DateTime.Now)
.Where(p => p.Id == "25e8d92e-29f2-43ff-b861-9ade0eec4041")
.ExecuteAffrows();
//批量修改
var updatePerson = new List<Person>();
updatePerson.Add(new Person
{
Id = "9cd7af52-85cc-4d26-898a-4020cadb0491",
Name = "update_name1",
UpdateTime = DateTime.Now
});
updatePerson.Add(new Person
{
Id = "bd9f9ed6-bd03-4675-abb4-12b7fdac7678",
Name = "update_name2",
UpdateTime = DateTime.Now
});
_fsql.Update<Person>().SetSource(updatePerson).UpdateColumns(person => new
{
person.Name,
person.UpdateTime,
}).ExecuteAffrows();
//_fsql.Update<Person>().SetSource()
}
[Fact]

View File

@ -7,6 +7,7 @@ using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using DateTime = System.DateTime;
namespace FreeSql.ClickHouse.Curd
{
@ -167,6 +168,16 @@ namespace FreeSql.ClickHouse.Curd
var colsql = _noneParameter ? _commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col, col.Attribute.MapType, val) :
_commonUtils.QuoteWriteParamterAdapter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"p_{_paramsSource.Count}"));
//判断是否是DateTime类型如果是DateTime类型需要转换成ClickHouse支持的时间格式
if (col.Attribute.MapType == typeof(DateTime) || col.Attribute.MapType == typeof(DateTime?) )
{
//获取当前实时区
var timeZone = TimeZoneInfo.Local;
colsql = $"toDateTime({colsql},'Asia/Shanghai')";
}
cwsb.Append(_commonUtils.RewriteColumn(col, colsql));
if (_noneParameter == false)
_commonUtils.AppendParamter(_paramsSource, null, col, col.Attribute.MapType, val);