当前位置:  开发笔记 > 编程语言 > 正文

Sql Server字符串到日期转换

如何解决《SqlServer字符串到日期转换》经验,为你挑选了7个好方法。

我想转换像这样的字符串:

'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')

这个问题暗示我必须将字符串解析为其中一种标准格式,然后使用其中一种代码进行转换.对于如此平凡的行动来说,这似乎是荒谬的.有没有更简单的方法?



1> 小智..:

试试这个

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

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

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


这是正确的方法,应该标记为正确的答案.请注意,`Cast('2011-07-07'as datetime)`也有效,并消除了月度订单的模糊性.

2> Taptronic..:

通过查询处理器运行此命令.它会像这样格式化日期和/或时间,其中一个应该可以为您提供所需的内容.它不会很难适应:

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)'



3> Aaron Bertra..:

在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日.



4> Philip Kelle..:

SQL Server(2005,2000,7.0)没有任何灵活的,甚至是非灵活的方式来采用字符串格式的任意结构化日期时间并将其转换为日期时间数据类型.

"任意地",我的意思是"写一个人的形式,尽管可能不是你或我或地球另一边的某个人,会认为是直觉而且非常明显." 坦率地说,我不确定是否有这样的算法.


有这样一种算法,Oracle已经实现了它,并且SQL Server缺乏等价物是一种持续的痛苦.
@PhilipKelley我不知道OP想要知道怎么做而不必知道格式.他明确表示他知道格式,并询问SQL Server是否有相当于TO_DATE的东西,即允许开发人员输入任意格式字符串的东西.
@matao请赐教我们,Oracle如何神奇地确定输入"9/6/12"的用户是指2012年9月6日,2012年6月9日,2009年12月6日还是别的什么?
不用担心,这里:http://www.techonthenet.com/oracle/functions/to_date.php显然它必须是开发人员指定的一致格式,但比MS给你的少数格式掩码灵活得多,这导致痛苦的自定义解析.
@JosphStyons知道Oracle的TO_DATE函数,如他的样本所示.他想知道是否有一种方法可以将日期转换为字符串**,而不必知道字符串的格式/结构.SQL不会这样做,而且肯定看来Oracle的TO_DATE也没有这样做.

5> Ovidiu Pacur..:

对于这个问题,我使用的最佳解决方案是在Sql Server 2005中使用CLR函数,该函数使用DateTime.Parse或ParseExact函数之一来返回具有指定格式的DateTime值.



6> 小智..:

为什么不试试

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

日期格式可以在SQL Server帮助程序> SQL Server日期格式中找到


应该是`select convert(date,'10/15/2011 00:00:00',101)`.有关格式和更多详细信息的详细信息,请访问https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

7> Simone..:

用这个:

SELECT convert(datetime, '2018-10-25 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm

并参考官方文档中的表格以获取转换代码。

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有