Mysql DB 返回错误的日期格式(C#)
Posted
技术标签:
【中文标题】Mysql DB 返回错误的日期格式(C#)【英文标题】:Mysql DB returns wrong date format (C#) 【发布时间】:2015-06-05 10:00:58 【问题描述】:这是一个关于我的 C#-App 令人困惑的情况的非常简单的问题:
用途: C# 桌面应用程序/mysql 5.5
发生了什么:
我的应用程序正在从数据库 (Select date from mytable
) 中选择一些数据。 date
列的格式为 yyyy-mm-dd
。在我的 C#-App 中检索数据后,我得到了一个文化敏感的输出。就我而言,格式为dd.mm.yyyy
。看看我的调试截图。
注意:变量listDate
来自string
!
我的输出看起来像 DateTime 类型。但我从未将其转换为 dateTime。列(db)date
设置为格式date
。
那么为什么我会得到这种格式?是数据库问题还是应用问题?
我的目标是获得与数据库内部相同的yyyy-mm-dd
格式。
感谢每一个帮助。非常感谢!!!
编辑 1:
我的代码:
public static void DB_Select(string s, params List<string>[] lists)
try
using(var conn = new MySqlConnection(ServerConnection))
conn.Open();
MySqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
string command = s;
cmd.CommandText = command;
using(var sqlreader = cmd.ExecuteReader())
while (sqlreader.Read())
if (sqlreader[0].ToString().Length > 0)
for (int i = 0; i < lists.Count(); i++)
lists[i].Add(sqlreader[i].ToString());
else
foreach (List<string> save in lists)
save.Add("/");
catch (Exception ex)
MessageBox.Show("Error while selecting data from database!\nDetails: " + ex);
无法想象这可能是问题所在。所有这一切都是循环输出并将单个列保存到不同的传递列表中(params List<string>[]
)
使用:
Services.DB_Select("SELECT date FROM myTable WHERE something = something")
所以一切都保存在字符串中,没有任何转换。它只是关于选择和输出 db -> c#。我选择一个日期格式并获得一个对文化敏感的 dateTime 值。这怎么可能?
编辑 2:(解决方案)
如果我像SELECT CONCAT(date) FROM mytable...
那样得到它(告诉数据库将 (col)date 作为字符串处理,我会得到干净的输出 yyyy-mm-dd !
没有 concat 我得到我的 dateTime 输出文化敏感。因此,date
列的日期格式一定是个问题。但是为什么 - 真的不知道。
【问题讨论】:
你能把你的作品也显示为文本吗?我认为它可以只是一个调试器表示。顺便说一句,您确定 MySQLdate
以特定格式保留它的值吗?例如,在 SQL Server 中,它将datetime
和datetime2
保存为二进制文件。
如何将 SELECT 语句放入 listDate
变量中?除非我们看到代码,否则我们无能为力。
请包含演示问题的(短)代码。(我希望日期列返回为DateTime
值:如果您收到文本,您可能做错了。)
没问题。不是我太懒了。我只是认为问题会以这种方式可见。我会在几分钟内编辑它。
所以这里的这一行将所有内容都转换为字符串sqlreader[i].ToString()
【参考方案1】:
如果你愿意,你可以像这样得到它:
string example = "20.08.2013 00:00:00";
DateTime result = GetDate(example);
通过使用这种方法:
public static DateTime GetDate(string stringFormat)
var date = stringFormat.Split(' ')[0].Split('.').Select(x => Int32.Parse(x)).ToArray();
return new DateTime(date[2], date[1], date[0]);
【讨论】:
谢谢。但这正是我不想走的路。这是我目前使用的。我的应用程序工作量很大。我的目标是获得更高的计算速度。我试图变得更清洁的第一件事是消除分裂。为此,我需要数据库的干净输出。【参考方案2】:由于您没有提供如何从数据库中获取数据,因此很难说。可能有两种选择 - 1)在检索数据时完成某种隐式转换,因此您从 db 获取格式化字符串或 2)您在获取数据后在某处进行转换。
您可以做的是转换为 DateTime
listDate.Select(d => DateTime.ParseExact(d,"dd.MM.yyyy hh:mm:ss",CultureInfo.InvariantCulture))
然后将其格式化回您需要的格式。
更好的解决方案当然是直接从数据库中获取 DateTime 中的日期。请为此发布您的代码。
编辑
问题在于 sqlreader[i].ToString() - 这会从环境中获取您的文化并进行转换。在这种情况下,我会检查值的类型,如果是 DateTime 然后使用 ToString("yyyy-MM-dd") 而不是简单的 ToString()
来自文档:
此方法使用来自当前的格式信息 文化。特别是,它结合了返回的自定义格式字符串 由 ShortDatePattern 和 LongTimePattern 属性 DateTimeFormatInfo 对象返回的 Thread.CurrentThread.CurrentCulture.DateTimeFormat 属性。更多 信息,请参阅 CultureInfo.CurrentCulture。其他重载 ToString 方法使您能够指定要格式化的区域性 使用 and 来定义 DateTime 值的输出模式。
【讨论】:
我提供了代码。就在你发帖前 3 分钟。 :) 仅供参考,您刚刚将转换逻辑移至 select 语句。每次使用它来选择日期时间时,您都必须考虑它。 ;) 这不是文化问题。我的问题是我的数据库中日期值的输出也带来了时间部分。所以它从 date 到 dateTime 对我来说没有任何合乎逻辑的理由。我从不关心 dateTime 输出本身的格式。 我想你还是不明白这一点。正如您所指出的,当您执行 SELECT date FROM mytable 时,您会得到 DateTime 作为输出。然后在 C# 中,你得到的对象不是字符串,而是 DateTime - 你得到了这个,你在 C# 中使用 .ToSting() call =culture specific 进行了转换。但是在您的解决方案中,您在数据库服务器上进行此转换,因此在 C# 中您不会获得 DateTime 对象,而是纯字符串。 我肯定知道我使用 .ToString() 进行转换。比特文化在任何方面都不重要是吗?我的问题是关于获取 DateTime 而不是日期作为字符串。文化本身只是日期时间格式的问题,对吗?这样我就一切都清楚了。还是谢谢。【参考方案3】:好的,我的一所大学告诉了我一个解决方案。至少对我来说这听起来很合乎逻辑:
col 本身来自date
类型,它是dateTime
的简短版本。当使用像SELECT date FROM mytable
这样的明确选择时,输出将是DateTime
。这就是为什么我也在我的输出中得到时间部分。
当使用SELECT CONCAT(date) FROM mytable
时,该值将像字符串一样处理。我自己找到了一种解决方法。这只会输出日期本身。
奇怪的行为。当然,因为我长期使用这个日期格式的列。从来没有遇到过任何问题。
非常感谢您的关注!
【讨论】:
以上是关于Mysql DB 返回错误的日期格式(C#)的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 代码中的 DB 中的 Linq 查询中包含空单元格
经验与坑MyBatis+MySQL 返回格式化日期以及动态表名和字段名