将字符串转换为datetime的问题

时间:2015-12-08 15:46:41

标签: c# asp.net sql-server datetime

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

2012-10-31 00:00:00.000

此列列为“datetime”类型。就像在ms sql server management studio中一样,我展开表,然后是列,并查看日期(PK,datetime,not null)。

然后在c#中,我得到那些带有语句的日期,并将其分配给一个变量,该变量填充了w / 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。

我无法使任何DateTime转换/分析/格式化正常工作。我花了四天时间。我在这里问了一个类似的问题: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);

4 个答案:

答案 0 :(得分:5)

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

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

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

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

编辑:改为尝试:

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

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

答案 1 :(得分: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!}

答案 2 :(得分:1)

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

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

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

column.DataType = typeof(DateTime);

答案 3 :(得分:1)

所以你有两个问题:

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

2)使用此列进行日期时间比较。

以下是两种方法:

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

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

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

B)操纵单个DateTime列

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

II。无论您在何处显示EntryDate列,都可以使用toString(“MM / dd / yyyy”)方法进行原位转换。

III。无论你在哪里比较,只需将其投射到Datetime&相比。