为了账号安全,请及时绑定邮箱和手机立即绑定

转换和验证日期字符串的最佳方法

转换和验证日期字符串的最佳方法

子衿沉夜 2019-11-04 10:32:31
我在存储过程中有一个格式化为ddmmyyyyy的单个char(8)变量(该值的质量和有效性是未知的,超出了我的控制范围)。什么是价值迁入日期时间变量,如果它不是有效的datetime抛出一个错误的最好最有效的方式。DECLARE @Source       char(8)DECLARE @Destination  datetimeSET @Source='07152009'--your solution hereSELECT @Destination这是我能想到的最好方法:DECLARE @Source             char(8)DECLARE @Temp               varchar(10)DECLARE @Destination        datetimeset @Source='07152009'SET @Temp=LEFT(@Source,2)+'/'+SUBSTRING(@Source,3,2)+'/'+RIGHT(@Source,4)IF ISDATE(@Temp)!=1BEGIN    RAISERROR('ERROR, invalid date',16,1)ENDSET @Destination=@TempSELECT @Source AS Source, @Temp AS  Temp, @Destination AS Destination编辑这就是我要去的...DECLARE @Source             char(8)DECLARE @Destination        datetimeset @Source='07152009'BEGIN TRY    SET @Destination=CONVERT(datetime,RIGHT(@Source,4)        -- YYYY                                      +LEFT(@Source,2)        -- MM                                      +SUBSTRING(@Source,3,2) -- DD                             )END TRYBEGIN CATCH    PRINT 'ERROR!!!' --I'll add a little more logic here and abort processingEND CATCHSELECT @Source AS Source, @Destination AS Destination
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

您可以使用SET DATEFORMAT保证日期-月份-年份的订单。这意味着ISDATE会将“ 15-07-2009”解析为2009年7月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


查看完整回答
反对 回复 2019-11-04
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

我的系统处于受控环境中,不会出现瑞士-德国日期转换问题。我确实喜欢尝试捕捉的想法。我可能会删除IF ISDATE()和@Temp,然后在执行SET @ Destination = LEFT(@ Source,2)+'/'+ SUBSTRING(@ Source,3,2)时捕获转换错误(如果有的话) +'/'+ RIGHT(@ Source,4)

查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 372 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信