Sql Server字符串到日期转换
我想转换像这样的字符串:
'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')
This question意味着我必须将字符串解析为standard formats之一,然后使用其中一个代码进行转换 . 对于如此平凡的行动来说,这似乎是荒谬的 . 有没有更简单的方法?
回答(10)
试试这个
Cast('7/7/2011' as datetime)
和
Convert(varchar(30),'7/7/2011',102)
有关详细信息,请参阅CAST and 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功能,这可以做得相当简单 . 然后,您可以根据需要为多种古怪的非标准格式编写一个案例/开关 .
UPDATE for @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日 .
为什么不试试
select convert(date,'10/15/2011 00:00:00',104) as [MM/dd/YYYY]
用这个:
SELECT convert(datetime, '2018-10-25 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm
并参考official documentation中的表格了解转换代码 .
page对CONVERT函数可用的所有指定日期时间转换都有一些引用 . 如果您的值不属于可接受的模式之一,那么我认为最好的方法是使用ParseExact路由 .
2 years ago
SQL Server(2005,2000,7.0)没有任何灵活的,甚至是非灵活的方式来采用字符串格式的任意结构化日期时间并将其转换为日期时间数据类型 .
“任意地”,我的意思是“写一个人的形式,尽管可能不是你或我或地球另一边的某个人,会认为是直觉而且非常明显 . ”坦率地说,我不确定是否有这样的算法 .