为什么从日期时间到varchar的CAST在一种环境中有效,而在另一种环境中无效?

时间:2018-12-13 22:18:56

标签: sql sql-server-2014

对于这个问题,我们有两个环境,Dev和Prod都运行sql2014,dev是开发人员版本,prod是企业版本。开发人员正在运行以下版本

enter image description here

产品正在运行以下版本

enter image description here

两者都使用相同的数据集(今天,产品数据库中的静态数据集已从产品数据库恢复为开发数据库),但是当从日期/时间转换为开发环境中的Varchar时,会引发对话错误,但是在我们的产品环境中,效果很好。

难道我们在这里看到的版本差异是它在我们较低的环境中不起作用的原因。

以下是开发版本的确切版本号:SELECT @@ Version

Microsoft SQL Server 2014 (SP2-GDR) (KB3194714) - 12.0.5203.0 (X64) 
Sep 23 2016 18:13:56 
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

产品版本

Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) 
Jun 17 2016 19:14:09 
Copyright (c) Microsoft Corporation
Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

这是我的SQL,如果想知道我到底在做什么,它是CTE Update语句的一部分:

 SELECT W.[order number], W.[BO NUMBER]
,CAST(MAX(cast(CT.[trans-date] as varchar) + ' ' + CT.[CHAR-OLD]) as date) AS 'TDate'
,SUBSTRING(cast(CAST(MAX(cast(CT.[trans-date] as varchar) + ' ' + CT.[CHAR-OLD]) as time(0))as varchar),1,5) as 'TTime'

FROM [dbo].[PURCHASE_TO_PORCH_WORK] W

            inner join dbo.[change_tracking] ct
            on W.[ORDER NUMBER]= ct.[document-num]
            and ct.[bo-number] = W.[BO NUMBER]

WHERE ct.[change-id] = 'WTRCV'
and W.[ACTION CODE] = 'SI'
group by [ORDER NUMBER], [BO NUMBER]

日期类型(两个环境):

[trans-date] =(日期,空)

[char-old] =(varchar(16),null)

1 个答案:

答案 0 :(得分:0)

问题实际上是数据库兼容性级别。假设设置为2008(100),但设置为2014(120)。我还通过不将CT。[trans-date]转换为varchar使其在2014(120)兼容性下工作。即使未提供该答案,该建议也帮助我排除了麻烦,非常感谢!