将字符串转换为日期时间的问题
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") 方法进行就地转换。
三。无论您在哪里比较,只需将其转换为日期时间并进行比较。
【讨论】:
以上是关于将字符串转换为日期时间的问题的主要内容,如果未能解决你的问题,请参考以下文章