将字符串转换为日期时间的问题

Posted

技术标签:

【中文标题】将字符串转换为日期时间的问题【英文标题】:Issues converting strings to datetime 【发布时间】:2016-03-13 14:56:29 【问题描述】:

我在 ms-sql 数据库中有一个表,其中包含如下列中的日期:

2012-10-31 00:00:00.000

此列被列为“日期时间”类型。如在 ms sql server management studio 中,我展开表,然后展开列,然后查看 Dates(PK, datetime, not null)。

然后在 c# 中,我使用语句获取这些日期,并将其分配给一个变量,该变量填充使用 asp.net 制作的网页上的网格列。 sql语句只是获取用户的最后一个条目。

        SqlCommand command = new SqlCommand();
        //connection info here
        sql2 = "select max(day) as day from users u join days d on d.User_ID = u.id where u.ActiveUser = 1 and u.id = " + Users["ID"].ToString();;
        command.CommandText = sql2;
        dates["Entry"] = command.ExecuteScalar();

这会像这样填充列中的日期:

10/31/2012 12:00:00 AM

现在,我不知道为什么会这样转换。我在调试时一直在跟踪数据,它使用 command.ExecuteScalar() 函数进行了更改。我想要的格式是:

10/31/2012

没有 hh/mm/ss AM。

我无法让任何日期时间转换/解析/格式正常工作。我为此花了四天时间。我在这里问了一个类似的问题:Converting date to proper format,尝试了所有不同的建议。

在此期间我正在做的是:

string dt = command.ExecuteScalar().ToString();
dt = dt.Substring(0, dt.IndexOf(" ") + 1); 
dates["Entry"] = dt;

删除返回的日期字符串中空格后的所有文本。这没关系,除了我想比较我得到的这些日期,所以我需要它们在 DateTime 中。试图将这些字符串转换为 DateTime 是行不通的。

编辑:定义和类型 -

DataRow dates;
//for loop here going through for each user
dates = _dtuserhours.NewRow(); // _dtuserhours is a DataTable
//Sql statements here
_dtuserhours = new DataTable("newtable");
DataColumn column;
column = new DataColumn();
column.DataType = System.Type.GetType("System.String");
column.ColumnName = "Entry";
_dtUserHours.Columns.Add(column);

【问题讨论】:

您是否尝试过使用日期作为列数据类型而不是日期时间? 很好的建议,但我无法使用数据库更改任何内容。我可以从中获取任何内容来阅读,但不能对其进行修改。 【参考方案1】:

首先,您需要更改您的 SQL 字符串以使用命令参数,否则您将面临 SQL 注入攻击。

接下来,您可以在 SQL Server 中调整 DateTime 字段的输出,以输出您要查找的格式。您得到的是 DateTime 的默认格式,具体取决于您的文化。

或者,您可以轻松地使用返回的 DateTime 对象的字符串格式化程序属性,如下所示:

dates["Entry"] = ((DateTime)command.ExecuteScalar()).ToString("MM/dd/yyyy");

编辑:试试这个:

dynamic result = command.ExecuteScalar();
dates["Entry"] = result.ToString("MM/dd/yyyy");

EDIT 的 EDIT - 设置为动态,因为编译器不知道 ExecuteScalar 在编译时返回什么。

【讨论】:

我一定会输入参数。之前有人在我的另一个问题上建议了字符串格式化程序属性,但这是我得到的错误“用户代码未处理 InvalidCastException。指定的转换无效。” 数据库中day列的数据类型是什么? 右键单击它并转到属性,它说数据类型是日期时间。全部小写。 如果你把结果放在一个变量中,用反射检查类型,它会返回什么?您是否向我们展示了您的所有代码? 如果我添加一个字符串变量 = command.ExecuteScalar().ToString(),则该值等于“10/31/2012 12:00:00 AM”。但是,dates["Entry"] 值为空,类型为 System.DBNull。我已经展示了我所有的代码。【参考方案2】:

如果您在让 .Net 将日期转换为您想要的确切格式时遇到问题,您可以随时将其转换为 SQL 中的格式化字符串。

请参阅http://www.techonthenet.com/sql_server/functions/convert.php 以获取可用格式的列表以及如何使用它们。在这种情况下,它会像

SELECT CONVERT(nvarchar, max(day), 101) AS day 
FROM users u JOIN days d ON d.User_ID = u.id 
WHERE etc, and parameterise your query!

【讨论】:

我已经尝试过使用 mm/dd/yyyy 的 '101' 值,但不确定如何将其添加到我的 sql 语句中,或者我是否完全需要一个新语句? (对 sql 很陌生)【参考方案3】:

在结果上调用 ToShortDateString 应该会以所需格式为您提供日期:

dates["Entry"] = ((DateTime)command.ExecuteScalar()).ToShortDateString()

要使其按预期工作,您需要将列 dates["Entry"] 的数据类型更改为 DateTime

column.DataType = typeof(DateTime);

【讨论】:

与下面的答案相同的问题,给出 InvalidCastException。 @pfinferno 很可能,问题在于dates 的定义。请发布dates 的定义方式 我认为你和敏锐的忍者正在努力。日期定义为 DataRow 日期; 在这样做时再次获得 InvalidCastException :/【参考方案4】:

所以你有两个问题:

1) 以特定格式显示日期时间列:(即 MM/dd/yyyy)

2) 将此列也用于日期时间比较。

这里有两种方法:

A) 在您的数据表中有两列(不是解决问题的好方法,但可以完成工作)。

我。一列用于显示(将是您在上面创建的数据类型字符串)。

二。用于比较的另一列具有 DateTime 数据类型。

B) 操作单个 DateTime 列

我。据我所知,Entry Date 有一个数据类型字符串,将其更改为 datetime 并通过 Executescalar 填充它而不进行任何字符串转换。

二。无论您在何处显示 EntryDate 列,请使用 toString("MM/dd/yyyy") 方法进行就地转换。

三。无论您在哪里比较,只需将其转换为日期时间并进行比较。

【讨论】:

以上是关于将字符串转换为日期时间的问题的主要内容,如果未能解决你的问题,请参考以下文章

将日期时间转换为字符串 PHP

将字符串转换为日期时间

将日期字符串转换为正确的格式

将字符串转换为日期和日期时间

将 UTC 日期时间字符串转换为本地日期时间

Python将日期时间字符串转换为日期