我试图将日期的用户输入解析为MySQL时间戳格式(YYYY-MM-DD)。 用户输入可以是:
input - wanted conversion 1) January - ThisYear-01-01, ThisYear-01-31 2) February 2017 - 2017-02-01, 2017-02-28 3) 01. April 2016 - 2016-04-01 4) 5.4.15 - 2015-04-05
P.S .: 上面的例子是我们想要支持的建议格式(只支持其中一些格式也可以)。 用户不是随机的或国际的,他们总是以这种格式(日月年)编写和理解日期。
处理缺失年份条目或零(如#4中的5/4)不是问题,但找到了处理上述可能日期输入格式的正确方法(DD MM YY,DD MM,DD Month,月份,月份YY,DD月份YY ....等等。在代码中看起来非常丑陋和冗长的东西对我来说有点难以想象。
P.S:
D,DD,MM,YY,YYYY是数字输入的缩写。
月份用于输入变体。
请您告诉我是否有什么可以帮助我使这个过程更容易/更易读或至少指向正确的方向?
由于
更新#1: 通过再次查看我上面的问题,我发现它缺少一些背景信息,但我不想写一个很长的描述,只是想要的功能。遗憾。
以下是关于该计划的一些一般信息: 该程序是一个用C#(UWP)编写的Chatbot,它以自然语言接受用户请求,并从mySQL DB(DB基于OSTicket支持系统)返回所请求的信息(如果识别)。
在内部,我们将用户输入发送到LUIS.ai以使其被识别,然后我们从服务中获取意图和实体,然后我们将其解析为SQL查询并将其发送到数据库。 然后将DB的结果发送回用户。
许多已解析的查询工作正常,这就是为什么我现在想通过让用户在请求中给出特定日期来扩展它(例如,从4月份给我所有支持票据)。 我唯一想要的是采取这一新的输入" April"并将其转换为MySQL TimeStamp格式,以便从MySQL中识别它。
我目前的做法是建立一个这样的字符串:
string convertedTS = year + "-" + month + "-" + day;
使用3个函数尝试检测所有三个变量。但现在就是这样。
E.g。 "给我4月份的所有门票": 4月(由LUIS AI确认为指定日期)将转换为(04) 年份将取自
DateTime.Today.Year
也插入(2018-04) 第一天总是01,月份的最后一天是:
DateTime.Today.Year
示例中的最终查询:
select ..........between '2018-04-01' AND '2017-04-30'
答案 0 :(得分:1)
如果您担心格式化年,月,日等,那么您做错了。你有C#,并且你有一个来自用户的日期字符串。您担心的是将该字符串转换为C# DateTime 值。 MySql没有这个部分。
获得DateTime值后,请让连接提供商担心通过参数化查询进行格式化:
DateTime d = GetMyDateTimeValueFromUser();
string sql = "pretend SQL comnand with a datetime @variable";
using (var cn = new MySqlConnection("connection string here"))
using (var cmd = new MySqlCommand(sql, cn))
{
cmd.Parameters.Add("@variable", MySqlDbType.Timestamp).Value = d;
cn.Open();
//pick one.
cmd.ExecuteReader();
cmd.ExecuteNonQuery();
}
不需要特殊的SQL格式。 如果您不使用参数化查询,那么您没有正确执行此操作! 这不仅适用于DateTime值。应该以这种方式处理SQL语句中使用的所有数据。这具有超出简单日期值的安全性和性能影响。去参数,或者回家(我的意思是:回家。别写不好的代码。我们不再需要了。)
因为它适用于这个问题,这意味着完全关于将字符串解析为C#DateTime值的问题。将此数据移动到SQL的下一步是不相关的。值得庆幸的是,.Net在这里有一些选择。具体来说,看一下Parse系列函数,包括:
DateTime.Parse()
DateTime.TryParse()
DateTime.ParseExact()
DateTime.TryParseExact()
后两种方法允许您指定允许格式的 set ,这些格式可以匹配系统实际看到的格式。 NuGet可以成为该领域的进一步资源。
你说的是什么?您想允许用户输入任何吗?这才刚刚起作用。期。真正的人类可以并且提出更多的方式来输入一个比你可能处理的日期更多的方法。更不用说当英国公民将1/2/2018的值输入您的系统时,您需要知道该怎么做,因为该人几乎肯定认为这意味着它意味着2018年2月1日,并且不 1月2日这样的文化差异意味着如果没有前端的某种上下文输入过滤器,就不可能接受日期输入。您必须查看您的用户界面,以帮助您的用户创建代码可以理解的价值......但我们在问题中没有足够的信息来提供该领域的任何指导。< / p>
答案 1 :(得分:0)
为了在我的程序中使用它,我修复了它。 现在我可以检测并理解这些输入: &#34; 09 11 2008&#34; &#34; 2017&#34; &#34;今天&#34; &#34;昨天&#34; &#34; 09/11/2002和#34; &#34; 2017年3月&#34; &#34; 01.01.2010&#34; &#34; 01-01-2010&#34; &#34; 01年5月1日&#34; &#34; 31. 2020年10月&#34; &#34; 01四月&#34; &#34;十二月&#34;
如果有人也有兴趣写一个类似的函数留下评论,因为代码差不多是300行。