Можно ли снизить точность SQL Server 2008 TIME до нескольких часов и минут? - PullRequest
6 голосов
/ 22 ноября 2010

В SQL Server 2008 тип данных time имеет необязательный аргумент точности (по умолчанию 7). При этом вы можете контролировать, сколько дробных десятичных знаков хранятся и отображаются.

DECLARE @time time(3)
SET @time = GETDATE()
PRINT @time

Выше будет напечатано это,

10:47:25.347

В документации сказано, что наименьшая точность равна time(0). Это будет хранить и печатать 10:47:25.

Можно ли еще снизить точность, исключить / обнулить секунды: 10:47?

Я знаю, что это можно сделать вручную, добавив ограничение (DATEPART(seconds, @time) = 0), выполнив математические операции при вводе данных, чтобы обнулить секунды, и вручную отформатировать при печати, но я ищу более простой способ просто определить поле в таблице как «часы и минуты», почти так же, как тип date позволяет определять поле как «только дата, без компонента времени».

Ответы [ 4 ]

4 голосов
/ 22 ноября 2010

Нет. Невозможно снизить точность типа данных time дальше, чем time(0)

2 голосов
/ 22 ноября 2010

Используйте smalldatetime и игнорируйте бит даты (это будет 01 января 1900 года). Обладает минутной точностью.

Как бы ни было полезно, это то, что мы делали в прежние времена (SQL Server 2005 и ранее: -)

1 голос
/ 22 ноября 2010

Если требуемый интервал является одним из распознаваемых интервалов SQL Server (минута, час, день и т. Д. ...), то другой вариант, который вы могли бы рассмотреть, - это определить свой собственный тип данных (скажем, вам нужны часы), а затем сохраните его как целое число, которое является просто абсолютным часом, начиная с некоторого базового эталонного времени (или используйте то же базовое эталонное время, которое использует SQL Server (полночь 1 января 1900 г.)

Преобразовать из сохраненного целочисленного значения (@IntVal) в фактический час в виде даты и времени (@realDT), используя следующее. (при условии, что @baseDatetime определено как базовое время

Declare @baseDatetime smalldatetime 
Set @baseDatetime = 0 -- for 1 Jan 1900, or  
Set @baseDatetime = 'd Month yyyy'  for some other base

 @realDT->@IntVal:  @IntVal = DateDiff(hour, @baseDatetime, @realDT)  
 @IntVal->@realDT:  @realDT = DateAdd(hour, @IntVal, @baseDatetime)
1 голос
/ 22 ноября 2010
SET @time = convert(varchar(5),getdate(),8)

Здесь вы приводите результат GETDATE к VARCHAR и форматируете его с модификатором 8, что означает формат времени.

EDIT: Thisдает вам строку, возможно, это не тот результат, который вы ищете.

С уважением.

...