我想转换一个像这样的字符串:
'10/15/2008 10:06:32 PM'
转换为Sql Server中的DATETIME值。
在甲骨文,我会这样说:
TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')
这个问题意味着我必须将字符串解析为一种标准格式,然后使用其中一种代码进行转换。对于这样一个平凡的行动来说,这似乎很荒谬。有没有更简单的方法?
我想转换一个像这样的字符串:
'10/15/2008 10:06:32 PM'
转换为Sql Server中的DATETIME值。
在甲骨文,我会这样说:
TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')
这个问题意味着我必须将字符串解析为一种标准格式,然后使用其中一种代码进行转换。对于这样一个平凡的行动来说,这似乎很荒谬。有没有更简单的方法?
当前回答
在MSSQL中隐式转换字符串到日期时间
create table tmp
(
ENTRYDATETIME datetime
);
insert into tmp (ENTRYDATETIME) values (getdate());
insert into tmp (ENTRYDATETIME) values ('20190101'); --convert string 'yyyymmdd' to datetime
select * from tmp where ENTRYDATETIME > '20190925' --yyyymmdd
select * from tmp where ENTRYDATETIME > '20190925 12:11:09.555'--yyyymmdd HH:MIN:SS:MS
其他回答
就个人而言,如果您正在处理任意的或完全不符合要求的格式,只要您事先知道它们是什么或将要是什么,那么只需使用regexp来提取您想要的日期部分,并形成有效的date/datetime组件。
SQL Server(2005, 2000, 7.0)没有任何灵活的,甚至是不灵活的方法来获取任意结构的字符串格式的datetime并将其转换为datetime数据类型。
所谓“随意”,我指的是“一种写作者(虽然可能不是你、我或地球另一边的人)认为是直观和完全明显的形式。”坦率地说,我不确定是否有这样的算法。
本页包含CONVERT函数可用的所有指定日期时间转换的一些引用。如果您的值不属于可接受的模式之一,那么我认为最好的方法是采用ParseExact路线。
在SQL Server Denali中,您将能够做一些接近您正在寻找的东西。但是你仍然不能仅仅传递任意定义的古怪日期字符串,并期望SQL Server能够适应。这里有一个例子,使用你在自己的回答中发布的内容。FORMAT()函数,也可以接受locale作为可选参数——它基于。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/2011,那是8月9日还是9月8日?如果你让他们在日历控件上选择日期,那么应用程序可以控制格式。无论你多么努力地预测用户的行为,他们总是会想出一个你没有计划的愚蠢的方式来输入日期。
直到Denali,我认为@Ovidiu的建议是目前为止最好的…这可以通过实现你自己的CLR函数而变得相当简单。然后你可以为你想要的许多古怪的非标准格式写一个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日。
dateadd(day,0,'10/15/2008 10:06:32 PM')