SQL Server и дата + 1 результат - PullRequest
5 голосов
/ 16 июля 2011

В случае SQL Server.Скажем, если у меня есть таблица со столбцом [myDate] типа datetime, что будет означать добавление 1 к ней в следующем контексте?

SELECT * 
  FROM [myTable] 
 WHERE [myDate] + 1 > @someDate

Ответы [ 6 ]

8 голосов
/ 16 июля 2011

Он добавляет один день (ровно 24 часа)

Однако ваш запрос более корректен.Функция или обработка столбца обычно делает недействительным использование индекса, если есть один из этих столбцов

WHERE [myDate] > @someDate - 1

ИЛИ

WHERE [myDate] > DATEADD(day, -1, @someDate)
4 голосов
/ 16 июля 2011

Используйте функцию DATEADD (подробнее см. Документы MSDN для DATEADD ):

SELECT * 
  FROM dbo.myTable
 WHERE DATEADD(D, 1, myDate) > @someDate

DATEADD позволяет добавить любой изобычные части даты (день, месяц, год), а также части времени (часы, минуты, секунды) и т. д.

2 голосов
/ 16 июля 2011

DATETIME может быть выражено как десятичное значение.Целая часть представляет дату, в то время как десятичное значение представляет время.

Таким образом, [DATETIME] + 1 означает «то же самое время на следующий день».

DateAdd безопаснее, поскольку ничего не предполагаетбазовая реализация.

1 голос
/ 16 июля 2011

Это добавит один день.Это дает преимущество того факта, что SQL Server хранит даты в виде двух целых чисел, одно из которых представляет количество дней со дня «0» - (1 января 1900 г.), а второе - число тактов (около 3,33 мс) с полуночи(на время) *.

Чтобы ваши запросы использовали индекс ... сначала используйте эту формулу для входных параметров фильтрации или на "другой" стороне знака равенства из поля даты и времени таблиц, чтобы оптимизатор запросов выполнялне нужно выполнять вычисления для каждого поля даты и времени в таблице, чтобы определить, какие строки удовлетворяют предикату фильтра.Это делает ваш аргумент поиска "SARG-способным" (Search ARGument)

 Where MyDateTimeColumn > DateAdd(day,       
         datediff(day,0, @MydateParameter), 0)    -- SARG-able

вместо

 Where DateAdd(day, datediff(day,0,       
   MyDateTimeColumn ), 0) > MydateParameter -- Not SARG-able •

В вашем случае это означает использование

   Select *
   FROM [myTable]  
   WHERE [myDate]  > @someDate - 1  

вместо

   Select *
   FROM [myTable]  
   WHERE [myDate] + 1  > @someDate   

ПРИМЕЧАНИЕ.Внутренне, второе целое число (часть времени) хранит тики.В день 24 х 60 х 60 х 300 = 25 920 000 тиков (по счастливой случайности чуть ниже максимального значения, которое может содержать 32-битное целое число).Однако вам не нужно беспокоиться об этом при арифметическом изменении даты и времени ... При добавлении или вычитании значений из даты и времени вы можете рассматривать значение как дробь, как если бы она была точно равна дробной части дня, как если быполное значение datetime было числом с плавающей запятой, состоящим из целой части, представляющей дату, и дробной части, представляющей время).то есть

  Declare @Dt DateTime Set @Dt = getdate()
  Set @Dt = @Dt + 1.0/24 -- Adds one hour
  Select @Dt
  Set @Dt = @Dt - .25 -- Moves back 6 hours
  Select @Dt
0 голосов
/ 22 ноября 2014

Простое добавление номера к типу DATE не работает.

Это работает:

SELECT CAST('2014-11-21 14:30' AS DATETIME) + 1

Это не:

SELECT CAST('2014-11-21 14:30' AS DATE) + 1

Это может быть проблемой при обновлении драйверов базы данных, которые могут отображать тип даты в DATETIME (потому что это все, что было в SQL2005), но изменить на использование DATE.

0 голосов
/ 16 июля 2011

Это должно добавить 1 день (24 часа) к дате, добавление 0.5 будет иметь полдня (12 часов), а добавление 2 добавит дни (48 часов) и т. Д. Но @Barry хорошо отмечает в своем комментарии,Вы можете попробовать и узнать.

Если вы хотите добавить другие минуты, секунды, миллисекунды и т. Д. Вам следует использовать функцию DATEADD , встроенную в SQL Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...