转换和验证日期字符串,最好的办法(best way to convert and validate

2019-06-14 17:44发布

我有一个存储过程中格式化为一个DDMMYYYY单个字符(8)变量(此值的质量和有效性是未知的,超出了我的控制)。 什么是价值迁入日期时间变量,如果它不是有效的datetime抛出一个错误的最好最有效的方式。

DECLARE @Source       char(8)
DECLARE @Destination  datetime

SET @Source='07152009'

--your solution here


SELECT @Destination

这里是我能想到的最好的办法:

DECLARE @Source             char(8)
DECLARE @Temp               varchar(10)
DECLARE @Destination        datetime

set @Source='07152009'
SET @Temp=LEFT(@Source,2)+'/'+SUBSTRING(@Source,3,2)+'/'+RIGHT(@Source,4)

IF ISDATE(@Temp)!=1
BEGIN
    RAISERROR('ERROR, invalid date',16,1)
END
SET @Destination=@Temp

SELECT @Source AS Source, @Temp AS  Temp, @Destination AS Destination

这里编辑就是我要去跟...

DECLARE @Source             char(8)
DECLARE @Destination        datetime

set @Source='07152009'
BEGIN TRY
    SET @Destination=CONVERT(datetime,RIGHT(@Source,4)        -- YYYY
                                      +LEFT(@Source,2)        -- MM
                                      +SUBSTRING(@Source,3,2) -- DD
                             )
END TRY
BEGIN CATCH
    PRINT 'ERROR!!!' --I'll add a little more logic here and abort processing
END CATCH

SELECT @Source AS Source, @Destination AS Destination

Answer 1:

首先,由于您使用的SQL Server 2005中,你应该把你的代码可能会失败,到BEGIN TRY.....END TRY BEGIN CATCH....END CATCH块- try / catch块的T-SQL!

其次,对于所有日期操作,我会一直使用ISO-8601格式 ,无论什么当前日期格式在SQL Server中设定的,这将正常工作。

ISO-8601格式是YYYYMMDD的只是日期,或YYYY-MM-DDTHH:MM:SS随时间日期-所以我会写你的代码:

BEGIN TRY
  SET @Source='07152009'
  SET @Temp = RIGHT(@Source, 4) +             -- YYYY
              LEFT(@Source, 2) +              -- MM
              SUBSTRING(@Source, 3, 2)        -- DD

  IF ISDATE(@Temp)!=1
  BEGIN
      RAISERROR('ERROR, invalid date',16,1)
  END

  SET @Destination = CAST(@Temp AS DATETIME)
END TRY
BEGIN CATCH
      -- handle error if something bombs out
END CATCH

不要依赖于任何特定的日期格式设定! 给我你的代码,我来试试,瑞士和德国的系统上-我几乎保证它会打破,如果你一味地假设“EN-US”,因此“MM / DD / YYYY” -这是一样的设定上随处可见这个星球上。

不幸的是SQL Server的相当弱处理日期 - 也许这其中可能使用SQL Server内部的CLR组件将使感,进军.NET中的更丰富的日期处理功能是扩展点?

PS:看来ISO-8601格式我知道YYYY-MM-DD并不总是在SQL Server的工作 - 相反的是联机丛书似乎讲道。 使用YYYYMMDD或YYYY-MM-DDTHH:MM:SS代替。
谢谢,GBN!



Answer 2:

你能保证日 - 月 - 年顺序使用SET DATEFORMAT。 这意味着,2009年7月ISDATE将解析'15 -07-2009' 作为第15届

否则,你的做法是不够好,考虑到外部限制......但你可以重新排序为ANSI / ISO太。

marc_s'的答案后:‘SET DATEFORMAT DMY’适用于大多数欧洲设置...

好:

SET LANGUAGE british
SELECT ISDATE('2009-07-15') --this is ansi says marc_s. It gives "zero"
SELECT ISDATE('2009-07-15T11:22:33') --this really is ANSI and gives true


SET LANGUAGE german
SELECT ISDATE('2009-07-15') --false
SELECT ISDATE('2009-07-15T11:22:33') --true


文章来源: best way to convert and validate a date string