我在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);
答案 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&相比。