2015-12-08 175 views
3

我有一个表,其中包含像这样一列日期的MS-SQL数据库:问题将字符串转换为datetime

2012-10-31 00:00:00.000 

这列被列为型“日期时间”。在ms sql server management studio中,我扩展了表,然后是列,并查看日期(PK,datetime,非空)。

然后在c#中,我得到这些日期w /一个语句,并将其分配给一个变量,填充网页上的一个网格的列在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 

现在,我不知道为什么它变得转换这样。我在调试的同时跟踪数据,并使用命令.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); 
+3

您是否尝试过使用日期作为列数据类型而不是日期时间? –

+0

好的建议,但我不能改变任何数据库。我被允许从中读取任何内容,但没有任何修改。 – pfinferno

回答

4

首先,你需要改变你的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"); 

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

+0

我一定会放入参数。有人在我之前的其他问题上建议过字符串格式化程序属性,但这是我得到的错误“InvalidCastException未被用户代码处理,指定的转换无效”。 – pfinferno

+0

数据库中日期列的数据类型是什么? –

+0

右键单击它并转到属性,它说数据类型是日期时间。全部小写。 – pfinferno

1

对结果调用ToShortDateString应该给你想要的格式日期:

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

对于这项工作预期,就需要为dates["Entry"]列的数据类型更改为DateTime

column.DataType = typeof(DateTime); 
+0

与下面的答案一样,给出一个InvalidCastException。 – pfinferno

+0

@pfinferno最有可能的问题是“日期”的定义。请张贴'日期'的定义 – HashPsi

+0

我觉得你和尖锐的忍者都会接受它。日期被定义为DataRow日期; – pfinferno

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!} 
+0

我试过这个使用'101'值为mm/dd/yyyy,但不确定如何将此添加到我的sql语句,或者如果我需要一个新的语句完全? (非常新的SQL) – pfinferno

+0

编辑显式语法 – eftpotrm

1

所以,你有两个问题:

1)显示特定格式的日期时间列:(即MM/DD/YYYY)

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

这里有两种方法:

A)有两列(解决的事情不是一个好办法,但得到完成工作)在你的数据表。

i。一列显示(这将是上面所做的数据类型字符串)。

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

B)操纵单个DateTime列

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

ii。无论您在哪里显示EntryDate列,都要使用toString(“MM/dd/yyyy”)方法进行就地转换。

iii。无论你在哪里比较,只需将它投射到日期时间&比较。