DATE数据类型的T-SQL隐式与显式转换

时间:2015-01-12 15:32:56

标签: sql-server

在获取DATETIME值并将其更改为T-SQL中的DATE值时,是否应明确执行CAST?例如:

DECLARE @Today_NoCast DATE = GETDATE();
DECLARE @Today_Cast DATE = CAST(GETDATE() AS DATE);

SELECT [GETDATE()] = GETDATE();

SELECT
[@Today_NoCast] = @Today_NoCast,
[@Today_Cast] = @Today_Cast;

GETDATE

Today

@Today_NoCast和@Today_Cast都会给出所需的结果。但是什么被认为是最佳实践"?

3 个答案:

答案 0 :(得分:0)

Date中的数据类型。您无需进行explicit转换。

所以请避免使用explicit转化

答案 1 :(得分:0)

您给出的示例是所谓的"隐式转换"。换句话说,SQL Server猜测转换它的最佳方式。这些转化是pretty diagram on MSDN。由于SQL Server将隐式执行此操作,因此您无需显式执行此操作。你只是在增加噪音。

我个人喜欢尽可能少量的日期操作。否则你会发现人们将它们全部投射到整个地方会导致代码味道。

如果您需要时间部分并因此存储时间,您可以根据需要在UI中格式化时间。

如果您发现需要在日期和时间上创建WHERE子句的查询,请考虑将日期和时间分成单独的字段以防止SEARCHARG,即开发人员在where子句中围绕索引列包装函数,从而阻止优化器从使用索引,因此降低性能。

答案 2 :(得分:0)

就SQL Server而言,在这种情况下没有区别 - 隐式(无CAST)和显式转换都会产生相同的结果。

但是,从代码维护的角度来看,存在细微差别。隐式转换只是另一行代码,可能(基于我的经验,没有反思你!),没有任何评论或文档或其他任何东西。在同一个地方显式转换也说"编写此代码的人知道GETDATE返回DATETIME但是他们不想要TIME部分所以故意将它保存到DATE"。

它没有让一行更易于维护,而且从长远来看,它会对你所有的工作采用这种方法。

里斯