From 9aef33e3df2951039ff2d3db3a9c9e397ae2c969 Mon Sep 17 00:00:00 2001 From: Daily <963922242@qq.com> Date: Thu, 30 May 2024 11:27:49 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3ClickHouse=20=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E6=9B=B4=E6=96=B0DateTime=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClickHouse/ClickhouseIssueTest.cs | 48 +++++++++++-------- .../ClickHouseUtils.cs | 2 +- .../Curd/ClickHouseUpdate.cs | 11 +++++ 3 files changed, 41 insertions(+), 20 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickhouseIssueTest.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickhouseIssueTest.cs index dac6315a..71bf127f 100644 --- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickhouseIssueTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickhouseIssueTest.cs @@ -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 - //{ - // 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() + .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(); + 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().SetSource(updatePerson).UpdateColumns(person => new + { + person.Name, + person.UpdateTime, + }).ExecuteAffrows(); - //_fsql.Update().SetSource() } [Fact] diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs index a4b93bb2..0061b284 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs @@ -158,7 +158,7 @@ namespace FreeSql.ClickHouse var ts = (TimeSpan)value; value = $"{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}"; } - else if (value is Array) + else if (value is Array) { var valueArr = value as Array; var eleType = type.GetElementType(); diff --git a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs index 3714bc27..740f63be 100644 --- a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs +++ b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs @@ -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);