Sql Serverstring到date的转换

我想要这样转换一个string:

'10/15/2008 10:06:32 PM' 

转换为Sql Server中的等效DATETIME值。

在Oracle中,我会这样说:

 TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM') 

这个问题意味着我必须将stringparsing为其中一种标准格式 ,然后使用其中一种代码进行转换。 对于这样一个普通的操作来说,这似乎很可笑。 有一个更简单的方法吗?

SQL Server(2005,2000,7.0)没有任何灵活的,甚至是非灵活的方式来以string格式取得任意结构化的date时间并将其转换为date时间数据types。

我所说的“任意”是指“写这个人的forms,虽然也许不是你或者我或者地球另一边的某个人,那么这个forms就会被认为是直观而完全显而易见的”。 坦率地说,我不确定有没有这样的algorithm。

尝试这个

 Cast('7/7/2011' as datetime) 

 Convert(varchar(30),'7/7/2011',102) 

有关更多详细信息,请参阅CAST和CONVERT(Transact-SQL) 。

通过查询处理器运行这个。 它格式化的date和/或时间,其中一个应该给你你想要的。 它不会很难适应:

 Declare @d datetime select @d = getdate() select @d as OriginalDate, convert(varchar,@d,100) as ConvertedDate, 100 as FormatValue, 'mon dd yyyy hh:miAM (or PM)' as OutputFormat union all select @d,convert(varchar,@d,101),101,'mm/dd/yy' union all select @d,convert(varchar,@d,102),102,'yy.mm.dd' union all select @d,convert(varchar,@d,103),103,'dd/mm/yy' union all select @d,convert(varchar,@d,104),104,'dd.mm.yy' union all select @d,convert(varchar,@d,105),105,'dd-mm-yy' union all select @d,convert(varchar,@d,106),106,'dd mon yy' union all select @d,convert(varchar,@d,107),107,'Mon dd, yy' union all select @d,convert(varchar,@d,108),108,'hh:mm:ss' union all select @d,convert(varchar,@d,109),109,'mon dd yyyy hh:mi:ss:mmmAM (or PM)' union all select @d,convert(varchar,@d,110),110,'mm-dd-yy' union all select @d,convert(varchar,@d,111),111,'yy/mm/dd' union all select @d,convert(varchar,@d,12),12,'yymmdd' union all select @d,convert(varchar,@d,112),112,'yyyymmdd' union all select @d,convert(varchar,@d,113),113,'dd mon yyyy hh:mm:ss:mmm(24h)' union all select @d,convert(varchar,@d,114),114,'hh:mi:ss:mmm(24h)' union all select @d,convert(varchar,@d,120),120,'yyyy-mm-dd hh:mi:ss(24h)' union all select @d,convert(varchar,@d,121),121,'yyyy-mm-dd hh:mi:ss.mmm(24h)' union all select @d,convert(varchar,@d,126),126,'yyyy-mm-dd Thh:mm:ss:mmm(no spaces)' 

在SQL Server Denali中,你将能够做一些你正在寻找的东西。 但是你仍然不能只传递任意定义的古怪的datestring,并期望SQL Server能够适应。 这是一个使用你自己的答案张贴的例子。 FORMAT()函数也可以接受语言环境作为可选参数 – 它基于.Net的格式,所以大部分(如果不是所有的)标记格式,你期望看到的将在那里。

 DECLARE @d DATETIME = '2008-10-13 18:45:19'; -- returns Oct-13/2008 18:45:19: SELECT FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss'); -- returns NULL if the conversion fails: SELECT TRY_PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME); -- returns an error if the conversion fails: SELECT PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME); 

我强烈build议您对dateinput进行更多的控制和消毒。 现在让人们用自己想要的任何格式inputdate到自由文本表单域的日子应该已经到了我们的后面了。 如果有人进入8月9日或9月8日? 如果你让他们select一个日历控件的date,那么应用程序可以控制格式。 无论你怎么预测用户的行为,他们总会找出一个笨重的方法来input你不打算的date。

但是,直到Denali,我认为@Ovidiu迄今为止拥有最好的build议……通过实现您自己的CLRfunction,这可以变得相当微不足道。 然后,你可以编写一个case / switch为许多古怪的非标准格式,只要你想。


更新@dhergert

 SELECT TRY_PARSE('10/15/2008 10:06:32 PM' AS DATETIME USING 'en-us'); SELECT TRY_PARSE('15/10/2008 10:06:32 PM' AS DATETIME USING 'en-gb'); 

结果:

 2008-10-15 22:06:32.000 2008-10-15 22:06:32.000 

你还需要先获得另一个关键信息。 您不能使用本地T-SQL来确定6/9/2012是6月9日还是9月6日。

对于这个问题,我使用的最佳解决scheme是在Sql Server 2005中使用CLR函数,它使用DateTime.Parse或ParseExact函数之一以指定的格式返回DateTime值。

为什么不尝试

 select convert(date,'10/15/2011 00:00:00',104) as [MM/dd/YYYY] 

date格式可以在SQL Server Helper> SQL Server Date Formats中find

此页面有一些对CONVERT函数可用的所有指定date时间转换的引用。 如果你的值不属于可接受的模式,那么我认为最好的办法是去ParseExact路线。

就个人而言,如果您处理任意或完全closures墙壁格式,提供您知道什么是提前或将要是然后简单地使用正则expression式来拉你想要的date的部分,并形成有效的date/date时间组件。

如果你想SQL Server试图找出它,只需使用CAST CAST('whatever'AS datetime)然而,这通常是一个坏主意。 有国际date的问题会出现。 所以正如你所发现的那样,为了避免这些问题,你需要使用date的ODBC规范格式。 格式编号120,20是两位数字的格式。 我不认为SQL Server有一个内置的函数,允许你提供给定的格式的用户。 你可以自己写,甚至可以find一个,如果你在网上search。