解析日期时间时转换错误

时间:2015-10-12 13:19:35

标签: sql sql-server-2008 tsql

我有一个批处理代码表,其中包含用于标记某些日期段的代码。但是,有些日期在管理表中没有条目。对于这些,我想在表格中使用年份为'9999'的默认值。但是,当我尝试更改年份时,我收到转换错误。

我可以从下面的代码中获取正确的值,我似乎无法在实际查询中使用它。

/* Works */
DECLARE @Date date
SET @Date = '2015-09-20'
SELECT CAST('9999' + '-' + CAST(MONTH(@Date) AS varchar) + '-' + CAST(DAY(@Date) AS varchar) AS date)
  

从字符串转换日期和/或时间时转换失败。

   /* Conversion error */ 
     SELECT 
            EndDate,
            CASE 
                WHEN (SELECT BatchCd FROM BatchCodeMGMT WHERE Orders.EXITDATE BETWEEN BatchStartDt AND BatchEndDt AND RegionBInd = 0 ) IS NULL THEN
                    (SELECT BatchCd FROM BatchCodeMGMT WHERE  --We set the year to the default year which is 9999 and compare them going backwards
                        CONVERT(date,('9999' + '-' + 
                                CAST(MONTH(Orders.EndDate) AS varchar) + '-' + 
                                CAST(DAY(Orders.EndDate) AS varchar) 
                        ))
                     BETWEEN BatchStartDt AND BatchEndDt AND AdultEdInd = 0 ) 
                ELSE
                    (SELECT BatchCd FROM BatchCodeMGMT WHERE Orders.EXITDATE BETWEEN BatchStartDt AND BatchEndDt AND AdultEdInd = 0 ) 
            END BatchCd
        FROM Orders 

批处理代码表或多或少是这样的,所有列也是非空的。因此,对于“2013-09-15”订单中的日期,我希望将其更改为“9999-09-15”并使用它从表格中挑选批次代码。

-------------------------------------
|BatchCd | BatchStart | BatchEnd    |
-------------------------------------
|  Pr2   | 9999-01-16 | 9999-06-14  |
|  Pr1   | 9999-06-15 | 9999-01-15  |
|  Pr2   | 2015-01-16 | 2015-06-14  |
|  Pr1   | 2015-06-15 | 2015-08-15  |
-------------------------------------

编辑:我发现当重叠日期时可能存在潜在问题。但是这个表不应该发生。

1 个答案:

答案 0 :(得分:0)

您可能需要准确告诉convert命令如何格式化数据。它看到#### - ## - ##,但它没有看到说明它是yyyy-mm-dd的说明。请看这里的表格:https://msdn.microsoft.com/en-us/library/ms187928.aspx

这将为您提供有效的日期格式。也许你将不得不改变你格式化的方式,或者你只需​​要告诉它你正在使用什么格式。