2015-01-09 3 views
2

Что такое real тип возврата DATEADD() в SQL? Документация Microsoft here говорит, что это date, их документация here говорит, что это datetime, а Intellisense в Management Studio говорит, что это smalldatetime.Каков REAL тип возврата DATEADD() в SQL?

Существует немалая разница между ними, и я удивлен, что Microsoft так сильно противоречит этому. date не хранит информацию о времени, а smalldatetime сохраняет особенно неточную информацию о времени; в любом из этих случаев вы также можете забыть о чем-то вроде попыток отслеживать количество пройденных миллисекунд.

я сделал попробовать следующий эксперимент:

select getdate(), DATEADD(ms, 150, getdate()) 

который надежно дает результаты, такие как:

2015-01-09 09:54:56.157, 2015-01-09 09:54:56.307 

Это искушает меня поверить, что ни один из трех зарегистрированных случаев являются истинными, но что это вместо этого возвращает значение datetime2. Это, кстати, в SQL Server 2012.

Так что я просто пытаюсь подтвердить:

  1. Является ли это на самом деле datetime2, или это datetime?

  2. Является ли это чем-то вполне согласным между различными, относительно современными версиями SQL Server (скажем, с 2005 года)?

  3. Есть ли что-нибудь еще в этой истории, что я не совсем вижу, или меня даже что-то отбрасывают?

Так, по существу, это еще один вопрос, который остается, «Что такое реальный тип возвращаемого значения?» но три точки выше, чем иллюстрируют, где я нахожусь на этом.

EDIT

Просто к сведению: На первой ссылке, я читал в первую очередь от верхней части страницы, и когда я увидел, что говорил date и другую ссылку, говоря datetime, я не чувствую так как я мог серьезно относиться к этим страницам, чтобы найти что-то еще, что было сказано. Аарон Бертран пояснил, что в отличие от датируются и датой, которая использовалась в этих документах, хотя Microsoft, вероятно, допустила ошибку в использовании курсива для очень нетехнических терминов.

+2

Во-первых, в документах говорится, что «тип данных аргумента даты» не «тип данных даты». Далее, никогда не верьте, что бессмыслица Intellisense подсказывает вам в ее подсказках - это неправильно чаще, чем это правильно. Теперь, почему вы думаете, что '2015-01-09 09: 54: 56.157' является' datetime2'? Для меня это похоже на «datetime», и это имеет смысл, потому что вход «datetime». Попробуйте использовать 'SYSDATETIME()' вместо 'GETDATE()'. Кроме того, [пожалуйста, прекратите использовать ленивую стенопись, например 'ms'] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date- время operations.aspx). –

+0

@AaronBertrand В первой ссылке говорится: «Возвращает указанную дату с указанным интервалом числа (целое число со знаком), добавленным к указанной дате части этой даты». и во второй ссылке говорится: «Возвращает новое значение datetime, добавляя интервал к указанной дате части указанной даты». В этих ссылках могут быть и другие утверждения, но после того, как основные два утверждения противоречат друг другу, трудно было серьезно относиться к чему-либо еще в этой документации. – Panzercrisis

+1

Это тонкий и, по общему признанию, сбивающий с толку, но обратите внимание на различное форматирование по всему документу - когда они говорят * дата *, они означают «некоторый тип даты/времени», но когда они говорят ** дата **, они означают явный тип данных. Это более очевидно, когда вы проверяете, что на самом деле происходит в SQL Server при подаче различных типов в качестве входных данных. –

ответ

3

From MSDN

Тип данных возврата является типом данных даты аргумента, для строковых литералов кроме. Тип данных возврата для строкового литерала - это дата и время. Ошибка будет повышаться, если масштаб строки с буквальным числом больше трех позиций (.nnn) или содержит часть смещения часового пояса.

Так что если третий параметр является одним из типов DATE, он вернет результат этого типа, например.

select CURRENT_TIMESTAMP, DATEADD(ms, 150, CAST(CURRENT_TIMESTAMP AS DATETIME)) 
select CURRENT_TIMESTAMP, DATEADD(ms, 150, CAST(CURRENT_TIMESTAMP AS DATETIME2)) 
select CURRENT_TIMESTAMP, DATEADD(ms, 150, CAST(CURRENT_TIMESTAMP AS SMALLDATETIME)) 

Возвращает 3 различных типов, а именно DateTime, DateTime2 and SmallDateTime соответственно.

+2

Да, общий ответ «это зависит». +1, хотя он также может возвращать другие типы. –

+0

, например. 'SELECT DATEADD (DAY, 1, CONVERT (DATE, GETDATE()));' возвращает 'date'. –