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

Why CAST from Date time to varchar works in one Environment but not the other?

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

产品是运行以下版本

两者都在使用相同的数据集(来自 prod.DB 的静态数据集今天从 Prod 恢复到 Dev),但是当从 Date/time 转换为 Dev 中的 Varchar 时,会抛出一个对话错误,但是在我们的 Prod 环境中,它工作得很好。

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

这里是 Dev Exact 版本号: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 更新声明的一部分:

 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]

日期类型(均为 Env):

[trans-date] = (date, null)

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

问题实际上是数据库兼容级别。应该设置为 2008 (100) 但现在是 2014 (120)。我还通过不将 CT.[trans-date] 转换为 varchar 来实现 2014 (120) 兼容性。即使没有提供那个答案,这个建议也帮助我解决了问题,非常感谢!