我想转换像这样的字符串:
'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')
这个问题暗示我必须将字符串解析为其中一种标准格式,然后使用其中一种代码进行转换.对于如此平凡的行动来说,这似乎是荒谬的.有没有更简单的方法?
试试这个
Cast('7/7/2011' as datetime)
和
Convert(varchar(30),'7/7/2011',102)
有关更多详细信息,请参阅CAST和CONVERT(Transact-SQL).
通过查询处理器运行此命令.它会像这样格式化日期和/或时间,其中一个应该可以为您提供所需的内容.它不会很难适应:
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中,您将能够做一些接近您正在寻找的东西.但是你仍然不能只传递任意定义的古怪日期字符串并期望SQL Server适应.以下是使用您在自己的答案中发布的内容的一个示例.FORMAT()函数也可以接受locales作为可选参数 - 它基于.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);
我强烈建议您采取更多控制措施并清理日期输入.让人们使用他们想要的任何格式键入日期到自由文本表单字段的日子应该是我们现在已经落后了.如果有人在8月9日或9月8日进入8/9/2011?如果您让他们在日历控件上选择日期,则应用程序可以控制格式.无论你多少尝试预测用户的行为,他们总会找出一种方法来输入你没有计划的日期.
但是,在Denali之前,我认为@Ovidiu到目前为止有最好的建议......通过实现自己的CLR功能,这可以做得相当简单.然后,您可以根据需要为多种古怪的非标准格式编写一个案例/开关.
更新@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日.
SQL Server(2005,2000,7.0)没有任何灵活的,甚至是非灵活的方式来采用字符串格式的任意结构化日期时间并将其转换为日期时间数据类型.
"任意地",我的意思是"写一个人的形式,尽管可能不是你或我或地球另一边的某个人,会认为是直觉而且非常明显." 坦率地说,我不确定是否有这样的算法.
对于这个问题,我使用的最佳解决方案是在Sql Server 2005中使用CLR函数,该函数使用DateTime.Parse或ParseExact函数之一来返回具有指定格式的DateTime值.
为什么不试试
select convert(date,'10/15/2011 00:00:00',104) as [MM/dd/YYYY]
日期格式可以在SQL Server帮助程序> SQL Server日期格式中找到
用这个:
SELECT convert(datetime, '2018-10-25 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm
并参考官方文档中的表格以获取转换代码。