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)

2 years ago

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

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

2 years ago

试试这个

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

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

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

2 years ago

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

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

2 years ago

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

2 years ago

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

2 years ago

为什么不试试

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

日期格式可在SQL Server Helper > SQL Server Date Formats找到

2 years ago

用这个:

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

并参考official documentation中的表格了解转换代码 .

2 years ago

page对CONVERT函数可用的所有指定日期时间转换都有一些引用 . 如果您的值不属于可接受的模式之一,那么我认为最好的方法是使用ParseExact路由 .

2 years ago

就个人而言,如果您处理任意或完全不在墙上的格式,只要您知道它们提前或将会是什么,那么只需使用正则表达式来提取您想要的日期部分并形成有效的日期/日期时间组件 .

2 years ago

如果您希望SQL Server尝试解决它,只需使用CAST CAST('任何'AS日期时间)但是这通常是一个坏主意 . 国际日期会出现问题 . 正如您所发现的,为了避免这些问题,您希望使用日期的ODBC规范格式 . 格式编号为120,20是两位数年份的格式 . 我不认为SQL Server有一个内置函数,允许您提供用户给定的格式 . 您可以自己编写,如果在线搜索,甚至可以找到一个 .