Вычисление интервала между двумя значениями DATE
Вычисление интервала между двумя значениями DATE

Вычисление интервала между двумя значениями DATE

Функция DATEADD стр. 1

Функция DATEADD (datepart, number, date) возвращает значение типа datetime, которое получается добавлением к дате date количества интервалов типа datepart, равного number (целое число).

Например, мы можем к заданной дате добавить любое число лет, дней, часов, минут и т. д.

Пусть сегодня 28.10.2005, и мы хотим узнать, какой день будет через неделю. Мы можем написать:

Консоль
Консоль

В результате получим одно и то же значение; что-то типа 2005-11-04 00:11:28.683.

Однако мы не можем в этом случае написать:

Консоль

и не потому, что четверть месяца не равна в точности неделе, а потому, что дробная часть значения аргумента datepart отбрасывается, и мы получим 0 вместо одной четвертой и, как следствие, текущий день.

Кроме того, мы можем использовать вместо CURRENT_TIMESTAMP функцию T-SQL (Transact-SQL) — процедурное расширение языка SQL, используемое для программирования на стороне сервера в Microsoft SQL Server и Sybase ASE. T-SQL GETDATE () с тем же самым эффектом. Наличие двух идентичных функций поддерживается, видимо, в ожидании последующего развития стандарта.

Определить, какой будет день через неделю после последнего полета.

В примерах данной главы используется база данных «Аэрофлот». Описание этой схемы и всех остальных схем, используемых в настоящее время на сайте для решения задач, можно найти в Примечании 1.

Консоль

Источник



Не могу разобраться с getdate

суть вопроса: как можно вычислить время при помощи getdate на сутки назад в формате datetime скажем вчерашний день с нуля часов и до 24:00?
А то если использовать day -1 то минусуется время ровно на 24 часа назад и если запрос запуститься в 12 дня, то и будет указываться время 12 часов дня, прошлого дня, а нужно, чтобы время с 00:00 до 24:00 вычислялось вне зависимости от времени запуска запроса.

Объясню проще
Запуская сегодня запрос, я хочу, чтобы дата была получена при помощи Getdate ит была 2013-05-13 00:00:00.000 и 2013-05-13 23:59:59.999
А не

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Задали работу, не могу разобраться. Используется делфи 10, не могу разобраться, как это сделать
В одномерном массиве, состоящем из n вещественных элементов, вычислить: минимальный элемент массива.

Не могу разобраться разобраться с кодом меню
Добрый день. Я понимаю, что тут все, наверное, элементарно. Но я только начала изучение js и пока.

Приветствую, не могу разобраться с кодом программы и не могу сделать .obj файл
.model tiny; нужно будет получить исполняемый файл формата СОМ .code org 100h start: mov ax.

Не могу найти ошибку!! не могу не как разобраться! надо до завтра.
условие: Для 7 человек, среди которых есть мужчины и женщины, хранятся следующие данные: имя, пол.

Источник

Арифметические операции над значениями даты/времени в PL/SQL

Основные операции над значениями даты/времени в Oracle сводятся к следующему набору:

Прибавление или вычитание интервала из значения даты/времени. Вычитание одного значения даты/времени из другого для определения интервала между двумя значениями. Прибавление или вычитание одного интервала из другого. Умножение или деление интервала на число.

По историческим причинам я раздельно рассматриваю арифметические операции со значениями типа DATE и операции, в которых задействованы типы семейств TIMESTAMP и INTERVAL.

Операции с типами TIMESTAMP и INTERVAL

Вычисления с интервалами «дни/секунды» легко выполняются при работе с типами данных семейства TIMESTAMP. Создайте значение INTERVAL DAY TO SECOND и используйте его при сложении и вычитании. Например, прибавление к текущей дате 1500 дней, 4 часов, 30 минут и 2 секунд выполняется следующим образом:

С интервалами «годы/месяцы» дело обстоит сложнее. Продолжительность любого дня составляет 24 часа, или 1440 минут, или даже 86 400 секунд, но не все месяцы имеют одинаковую продолжительность в днях: 28, 29, 30 или 31 день. По этой причине простое прибавление одного месяца к дате может привести к неоднозначному результату. Допустим, вы прибавляете один месяц к последнему дню мая; что получится — последний день июня или недействительная дата 31 июня? Все зависит от того, что должны представлять интервалы.

Oracle предоставляет необходимые средства для получения любого из этих результатов. Программист сам решает, какой вариант поведения должен реализоваться системой. Если конец месяца должен быть преобразован в конец месяца (31 мая + 1 месяц = 30 июня), используйте функцию ADD_MONTHS. Если изменение дня месяца нежелательно, используйте значение INTERVAL YEAR TO MONTH. В этом случае при прибавлении к 31 мая 2008 года INTERVAL ‘1’ MONTH будет получено значение 31 июня 2008 года, а СУБД выдаст сообщение об ошибке.

Вычисления с типом INTERVAL YEAR TO MONTH лучше зарезервировать для тех значений даты/времени, которые усекаются по началу месяца или, скажем, по 15 числу — они плохо подходят для конца месяца. Если вам потребуется прибавить или вычесть сколько-то месяцев (или лет — аналогичная проблема возникает при прибавлении одного кода к 29 февраля 2008 года) из даты, в которой может быть задействован конец месяца, используйте функцию ADD_MONTHS. Эта функция, возвращающая тип DATE, решает проблему преобразованием соответствующих дат в последний день месяца вместо выдачи ошибки. Например, ADD_MONTHS(’31-May-2008′,1) вернет 30 июня 2008 года. Полученное значение DATE не содержит данных часового пояса (или долей секунд); если в результате должны присутствовать эти компоненты, вам придется реализовать дополнительную логику извлечения и повторного внесения этих компонентов в результат.

Читайте также:  Аменорея формы симптомы лечение

Аналогичной функции вычитания SUBTRACT_MONTHS не существует, но ADD_MONTHS можно вызывать с отрицательным количеством месяцев. Например, вызов ADD_MONTHS(current_date, -1) в приведенном примере вернет дату за один месяц до последнего дня апреля.

Операции с типом DATE

В операциях с типом DATE можно использовать как значения INTERVAL, так и числовые значения, представляющие дни и их доли. Например, прибавление одного дня к текущей дате и времени выполняется так:

Прибавление четырех часов к текущей дате и времени:

Обратите внимание на использование дроби 4/24 вместо 1/6. При чтении кода сразу становится ясно, что значение, возвращаемое SYSDATE, увеличивается на 4 часа; а если использовать 1/6, программист, который будет заниматься сопровождением кода, будет долго ломать голову над тем, что должна означать эта таинственная дробь. Для еще более явного выражения намерений можно воспользоваться именованной константой:

В табл. 10.4 приведены дробные значения, представляющие часы, минуты и секунды при работе с DATE. Также в нее включены некоторые дробные значения, которые могут использоваться для построения этих значений.

Значение Выражение Представляет
1/24 1/24 Один час
1/1440 1/24/60 Одна минута
1/86400 1/24/60/60 Одна секунда

Используйте значения из табл. 10.4, и ваш код станет более понятным. Программист, привыкший к этим трем делителям, без труда поймет, что 40/86400 означает 40 секунд. Понять, что дробь 1/21610 означает то же самое, будет намного сложнее.

Вычисление интервала между двумя значениями DATE

Интервал между двумя значениями из семейства TIMESTAMP вычисляется простым вычитанием одного значения из другого. Результат всегда относится к типу INTERVAL DAY TO SECOND. Например:

Интервалы могут быть отрицательными или положительными. Отрицательный интервал означает, что более недавняя дата вычитается из даты, находящейся в прошлом:

Знак результата задает направленность интервала. К сожалению, не существует функции абсолютного значения для интервалов — аналога функции ABS для числовых значений.

Если вы вычисляете интервал между двумя значениями типа DATE, результатом является количество 24-часовых периодов (не то же самое, что количество дней) между ними. Если получено целочисленное значение, то разность представляет точное количество дней. Если же значение является дробным, то разность включает также некоторое количество часов, минут и секунд. Следующий пример взят из предыдущего раздела, но в нем используется тип DATE:

Три дня — понятно, но что такое 0.40208333333333333333333333333333333333? Даты часто усекаются перед вычитанием или же усекается полученный результат. Использование типов INTERVAL и TIMESTAMP значительно упрощает правильное усечение длинной дробной строки до часов, минут и секунд.

Для вычисления интервалов между двумя значениями DATE также удобно пользоваться функцией MONTHS_BETWEEN. Функция имеет следующий синтаксис:

Функция MONTHS_BETWEEN работает по следующим правилам:

Если дата_1 наступает позже даты_2, MONTHS_BETWEEN возвращает положительное число. Если дата_1 наступает раньше даты_2, MONTHS_BETWEEN возвращает отрицательное число. Если дата_1 и дата_2 относятся к одному месяцу, функция возвращает дробное значение из диапазона от –1 до +1. Если дата_1 и дата_2 приходятся на последние дни соответствующих месяцев, функция возвращает целое число (без дробного компонента). Если дата_1 и дата_2 относятся к разным месяцам и хотя бы одна из них не приходится на последний день месяца, функция возвращает дробное значение. (Дробный компонент вычисляется для месяцев, состоящих из 31 дня, с учетом разницы компонентов времени двух дат.)

Несколько примеров использования MONTHS_BETWEEN:

Вероятно, вы заметили здесь определенную закономерность. Как уже было сказано, функция MONTHS_BETWEEN вычисляет дробный компонент количества месяцев исходя из предположения, что каждый месяц содержит 31 день. Поэтому на каждый день сверх полного месяца к результату прибавляется 1/31 месяца:

В соответствии с этим правилом количество месяцев между 31 января 1994 года и 28 февраля 1994 года равно 1 — удобное целое число. Однако количество месяцев между 31 января 1994 года и 1 марта 1994 года увеличивается на .032258065. Как и в случае с вычитанием DATE, при работе с MONTHS_BETWEEN часто используется функция TRUNC.

Смешанное использование DATE и TIMESTAMP

Результатом вычитания двух TIMESTAMP является значение типа INTERVAL DAY TO SECOND. Результат вычитания с двумя значениями DATE представляет собой числовое значение. Соответственно, если требуется вычесть одно значение DATE из другого и вернуть значение INTERVAL DAY TO SECOND, вам придется преобразовать DATE в TIMESTAMP функцией CAST. Пример:

Если значения DATE и TIMESTAMP смешиваются в одном выражении вычитания, PL/SQL выполняет неявное преобразование DATE в TIMESTAMP. Пример:

Как обычно при работе с типами данных даты и времени, в программе желательно использовать явные преобразования.

Сложение и вычитание интервалов

В отличие от значений даты/времени, операция суммирования интервалов выглядит вполне разумно. Также имеет смысл и вычитание одного интервала из другого. Необходимо лишь помнить, что интервалы, участвующие в суммировании или вычитании, должны относиться к одному типу. Например:

Пример демонстрирует результаты трех вычитаний интервалов. В первых двух операциях участвуют интервалы INTERVAL DAY TO SECOND и INTERVAL YEAR TO MONTH. В третьей операции используется вычитание двух чисел. Запомните: при работе с типами DATE интервал между двумя значениями DATE выражается типом NUMBER. Так как месяц может состоять из 28, 29, 30 или 31 дня, при попытке суммирования или вычитания интервала «дни/секунды» с интервалом «годы/месяцы» происходит ошибка.

Читайте также:  История праздника юрьев день

Умножение и деление интервалов

Операции умножения и деления не применимы к датам, но зато интервал можно умножить или разделить на число. Несколько примеров:

Типы данных INTERVAL без ограничений

Интервалы можно объявлять с разным уровнем точности, причем значения разной точностью не полностью совместимы между собой. Проблема особенно наглядно проявляется при написании процедур и функций, получающих параметры типа INTERVAL. Обратите внимание на потерю точности в следующем примере, где значение переменной dts удваивается с помощью функции double_my_interval:

Результат выполнения кода:

Цифры были потеряны не только в дробной части секунд, но и в значении количества дней. А если бы переменной dts было присвоено значение, равное 100 или более дням, попытка вызова функции double_my_interval привела бы к ошибке!

Дело в том, что задаваемая по умолчанию точность типов данных INTERVAL не равна максимально возможной точности. Обычно вызывающая программа передает точность параметров программе PL/SQL, но с типами данных INTERVAL используется принятая по умолчанию точность 2. Для решения этой проблемы можно воспользоваться типами данных INTERVAL, явно объявляемыми без ограничения точности:

YMINTERVAL_UNCONSTRAINED — принимает любое значение типа INTERVAL YEAR TO MONTH без потери точности; DSINTERVAL_UNCONSTRAINED — принимает любое значение типа INTERVAL DAY TO SECOND без потери точности.

Воспользовавшись типом DSINTERVAL_UNCONSTRAINED, приведенный выше пример можно переписать следующим образом:

Результат будет таким:

Обратите внимание на то, что тип данных DSINTERVAL_UNCONSTRAINED используется дважды: один раз для задания типа формального параметра функции double_my_interval, а второй — для задания типа возвращаемого значения. В результате эту функцию можно вызывать для любого значения типа INTERVAL DAY TO SECOND без потери точности или ошибок.

Источник

DATEADD (Transact-SQL)

Применимо к: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics Параллельное хранилище данных

Эта функция добавляет указанное значение number (целое число со знаком) к заданному аргументу datepart входного значения date, а затем возвращает это измененное значение.

Обзор всех типов данных и функций даты и времени в языке Transact-SQL см. в статье Типы данных и функции даты и времени (Transact-SQL).

Синтаксис

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

datepart
Компонент даты date, к которому DATEADD добавляет целое число. В приведенной ниже таблице перечислены все допустимые аргументы datepart.

DATEADD не принимает эквивалентные переменные, определяемые пользователем, для аргументов datepart.

datepart Сокращения
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
weekday dw, w
hour hh
minute mi, n
second ss, s
millisecond ms
microsecond mcs
nanosecond ns

number
Выражение, которое разрешается в тип int, добавляемый DATEADD к компоненту datepart даты date. DATEADD принимает определяемые пользователем значения переменных для number. DATEADD усечет указанное значение number, имеющее десятичную дробь. В этой ситуации значение number не округляется.

date
Выражение, которое может быть разрешено в одно из следующих значений.

  • date
  • datetime
  • datetimeoffset
  • datetime2
  • smalldatetime
  • time

Для date DATEADD будет принимать столбец выражения, выражение, строковый литерал или определяемую пользователем переменную. Значение строкового литерала должно разрешаться в datetime. Во избежание неоднозначности используйте четырехзначную запись года. Сведения о двузначном обозначении года см. в статье Настройка параметра конфигурации сервера two digit year cutoff.

Типы возвращаемых данных

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

Возвращаемое значение

Аргумент datepart

Функции dayofyear, day и weekday возвращают одинаковое значение.

Каждое выражение datepart и его краткие формы возвращают одно и то же значение.

Если верны следующие условия:

  • datepart имеет значение month;
  • в месяце date больше дней, чем в возвращаемом месяце;
  • день date не существует в этом месяце;

то DATEADD возвращает последний день возвращаемого месяца. Например, в сентябре 30 (тридцать) дней, поэтому эти инструкции возвращают 2006-09-30 00:00:00.000:

Аргумент number

Аргумент number не может выходить за диапазон типа данных int. В приведенных ниже инструкциях аргумент number превышает диапазон типа данных int на 1. Обе эти инструкции возвращают сообщение об ошибке: » Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int.»

Аргумент date

DATEADD не будет принимать аргумент date, увеличенный до значения, выходящего за диапазон соответствующего типа данных. В приведенных ниже инструкциях значение number, добавленное к значению date, превышает диапазон типа данных date. DATEADD возвращает следующее сообщение об ошибке: » Msg 517, Level 16, State 1, Line 1 Adding a value to a ‘datetime’ column caused overflow «.

Возвращаемые значения дат с типом данных smalldatetime и частью даты в виде секунд или долей секунды.

Значение секунд даты типа smalldatetime всегда равно 00. Для значения date типа smalldatetime действуют указанные ниже условия.

  • Для части даты datepart секунды second и значения number в диапазоне от –30 до +29 DATEADD не вносит никаких изменений.
  • Для части даты datepart секунды second и значения number меньше –30 или больше +29 DATEADD выполняет добавление, начиная с одной минуты.
  • Для части даты datepart миллисекунды millisecond и значения number в диапазоне от –30 001 до + 29 998 DATEADD не вносит никаких изменений.
  • Для части даты datepart миллисекунды millisecond и значения number меньше –30 001 или больше +29 998 DATEADD выполняет добавление, начиная с одной минуты.

Remarks

Используйте DATEADD в следующих предложениях.

  • GROUP BY
  • HAVING
  • ORDER BY
  • SELECT
  • WHERE

Точность в долях секунды

DATEADD не допускает использование при сложении в качестве аргумента datepart значений microsecond или nanosecond для типов данных date: smalldatetime, date и datetime.

Миллисекунды имеют точность 3 знака (0,123), микросекунды — 6 знаков (0,123456), наносекунды — 9 знаков (0,123456789). Типы данных time, datetime2 и datetimeoffset имеют максимальную точность 7 знаков (0,1234567). Если аргументом datepart является nanosecond, аргумент number должен иметь значение 100 перед увеличением даты date на доли секунды. number от 1 до 49 округляется до 0, а number от 50 до 99 округляется до 100.

Эти инструкции добавляют часть даты datepart: millisecond, microsecond или nanosecond.

Смещение часового пояса

DATEADD не допускает добавление для смещения часового пояса.

Примеры

A. Увеличение части даты на интервал, равный 1

Каждая из этих инструкций увеличивает часть даты datepart на интервал, равный 1.

Б. Увеличение нескольких уровней части даты в одной инструкции

Каждая из этих инструкций увеличивает часть даты datepart на число number, достаточно большое, чтобы также увеличить следующую часть datepart даты date.

В. Использование выражений в качестве аргументов number и date

В этих примерах выражения различного типа используются в качестве аргументов для параметров number и date. В примерах используется база данных AdventureWorks.

Указание столбца в качестве аргумента date

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

Частичный результирующий набор имеет следующий вид:

Указание пользовательских переменных в качестве аргументов number и date

В этом примере в качестве аргументов number и date указываются пользовательские переменные.

Указание в качестве аргумента date скалярной системной функции

В этом примере для аргумента date указано значение SYSDATETIME . Точное возвращаемое значение зависит от дня и времени выполнения инструкции.

Указание в качестве аргументов number и date скалярных вложенных запросов и скалярных функций

В этом примере в качестве аргументов для number и date используются скалярные вложенные запросы MAX(ModifiedDate) . (SELECT TOP 1 BusinessEntityID FROM Person.Person) является искусственным аргументом для числового параметра, показывающим способ выбора аргумента number из списка значений.

Указание в качестве аргументов number и date числовых выражений и скалярных системных функций

В этом примере в качестве аргументов number и date используется числовое выражение (– (10/2)) , унарные операторы ( — ), арифметический оператор ( / ) и скалярные системные функции ( SYSDATETIME ).

Указание в качестве аргумента number ранжирующих функций

В этом примере в качестве аргумента number используется ранжирующая функция.

Указание в качестве аргумента number статистической оконной функции

В этом примере в качестве аргумента number используется агрегатная оконная функция.

Источник

Ms sql getdate минус день

This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.

Answered by:

Question

How would I write a simple command to show the current date minus exactly one year?

Any advice is appreciated.

Thanks,
Ryan
Ryan Mcbee

Answers

GetDate() returns the current date, and DateAdd can be used for date math. You would do this:

SELECT DateAdd ( yy , — 1 , GetDate ())

  • Proposed as answer by gvee Editor Wednesday, February 11, 2009 8:50 AM
  • Marked as answer by Jinchun Chen Microsoft employee Friday, March 6, 2009 9:07 AM

You can also use either year or yy or yyyy like

SELECT DATEADD ( Year ,- 1 , GETDATE ())

  • Proposed as answer by Nikka Lovely Wednesday, February 11, 2009 11:01 AM
  • Marked as answer by Jinchun Chen Microsoft employee Friday, March 6, 2009 9:07 AM

All replies

GetDate() returns the current date, and DateAdd can be used for date math. You would do this:

SELECT DateAdd ( yy , — 1 , GetDate ())

  • Proposed as answer by gvee Editor Wednesday, February 11, 2009 8:50 AM
  • Marked as answer by Jinchun Chen Microsoft employee Friday, March 6, 2009 9:07 AM

You can also use either year or yy or yyyy like

SELECT DATEADD ( Year ,- 1 , GETDATE ())

  • Proposed as answer by Nikka Lovely Wednesday, February 11, 2009 11:01 AM
  • Marked as answer by Jinchun Chen Microsoft employee Friday, March 6, 2009 9:07 AM

It depends on what you WANT to happen?

What should the Year-Ago date be based on Feb29,2008?

Shouldn’t it be Feb28,2007?

Or do you think it should be Mar01,2007?
—Brad (My Blog)

Источник