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&lt;string&gt;[]

使用:

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 列的日期格式一定是个问题。但是为什么 - 真的不知道。

【问题讨论】:

你能把你的作品也显示为文本吗?我认为它可以只是一个调试器表示。顺便说一句,您确定 MySQL date 以特定格式保留它的值吗?例如,在 SQL Server 中,它将datetimedatetime2 保存为二进制文件。 如何将 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 =&gt; 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 返回格式化日期以及动态表名和字段名

C# 读取Excel日期格式

求C#高手,Excel中单元格显示的是日期格式,当我读取到DataGridView中时,就变成了文本格式了

mysql日期时间格式使用c#

mysql 时间转换 用EXCEL实现MySQL时间戳格式和日期格互转