将DATEFORMAT设置回原来的样子

时间:2015-03-26 13:20:31

标签: sql-server-2008 tsql

因此,对于我需要执行的一个操作,我需要将Dateformat设置为ymd以确保所有日期字符串都是yyyy-mm-dd

SET DATEFORMAT ymd
SET @valid = ISDATE(@DateString)

现在,我总是想把服务器放回原来的状态,所以无论如何我可以在更改之前捕获或知道dateformat是什么?

在测试中我发现了这个问题。现在我可以通过查看字符串长度来解决它,但我不知道为什么第三个select语句是有效的

SET DATEFORMAT ymd
select ISDATE('2015-04-15') -- 1
select ISDATE('2015-14-05') -- 0
select ISDATE('05-04-2005') -- 1 ??

2 个答案:

答案 0 :(得分:1)

SQL Server 2008及以下

IF OBJECT_ID('tempdb..#yourTable') IS NOT NULL
    DROP TABLE #yourTable;

SELECT * INTO #yourTable
FROM (
    SELECT '2015-04-15' testDates UNION ALL SELECT '2015-14-05' UNION ALL SELECT '05-04-2015'
) A

SELECT  *,
        CASE
            WHEN    ISNUMERIC(LEFT(testDates,4)) = 1 --checks if first four char are a year
                    AND SUBSTRING(testDates,6,2) <= 12 --checks if middle two numbers are valid months
            THEN 1
            ELSE 0
        END
FROM #yourTable

SQL Server 2012及更高版本

SELECT TRY_CONVERT(DATE,'2015-04-15',102) --'2015-04-15'
SELECT TRY_CONVERT(DATE,'2015-14-05',102) --NULL
SELECT TRY_CONVERT(DATE,'05-04-2015',102) --NULL

--This would get your results from a table
SELECT  CASE
            WHEN TRY_CONVERT(DATE,yourCol,102) IS NOT NULL 
                THEN 1
            ELSE 0
        END
FROM yourTable

答案 1 :(得分:1)

XML中的有效日期是yyyy-mm-dd,因此您可以在SQL Server中使用XML数据类型并执行&#34;尝试转换&#34;在那里查看字符串值是否是有效日期。

declare @T table(D varchar(10))

insert into @T(D) values
('2015-04-15'),
('2015-14-05'),
('05-04-2005');

select cast('' as xml).exist('sql:column("T.D") cast as xs:date?') as IsDate
from @T as T

结果:

IsDate
------
1
0
0

为什么&#39; 05-14-2005&#39;返回1?

SQL Server尝试在这里提供帮助,并通过识别行中的4位数来查找年份的位置,并使用set dateformat按月和日计算订单。

现在,我总是希望以我发现的方式恢复服务器

set dateformat是每个连接的设置,所以你实际上不必恢复它吗?

要获取连接的当前值,您可以使用:

select date_format
from sys.dm_exec_sessions
where session_id = @@spid