因此,对于我需要执行的一个操作,我需要将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 ??
答案 0 :(得分:1)
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
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