sql getdate минус день
GETDATE (Transact-SQL)
Возвращает текущую системную метку времени базы данных в виде значения datetime без смещения часового пояса базы данных. Это значение наследуется от операционной системы компьютера, на котором работает экземпляр SQL Server.
SYSDATETIME и SYSUTCDATETIME имеют большую точность в долях секунды, чем GETDATE и GETUTCDATE. SYSDATETIMEOFFSET включает смещение часового пояса, заданное в системе. SYSDATETIME, SYSUTCDATETIME и SYSDATETIMEOFFSET можно присваивать переменным любого типа даты и времени.
База данных SQL Azure (за исключением Управляемого экземпляра SQL Azure) и Azure Synapse Analytics используют время в формате UTC. Если необходимо интерпретировать сведения о дате и времени в часовом поясе, отличном от UTC, используйте AT TIME ZONE в Базе данных SQL Azure или Azure Synapse Analytics.
Обзор всех типов данных и функций даты и времени в языке Transact-SQL см. в статье Типы данных и функции даты и времени (Transact-SQL).
Синтаксические обозначения в Transact-SQL
Синтаксис
Тип возвращаемых данных
datetime
Remarks
Функция GETDATE может использоваться в инструкциях Transact-SQL везде, где допустимо использование выражения datetime.
GETDATE является недетерминированной функцией. Невозможно проиндексировать представления и выражения, ссылающиеся на эту функцию в столбце.
Использование SWITCHOFFSET с функцией GETDATE() может вызвать замедление выполнения запроса, поскольку оптимизатор запросов не может получить точные оценки количества элементов для значения GETDATE. Рекомендуется заранее вычислить значение GETDATE, а затем указать это значение в запросе, как показано в следующем примере. Кроме того, с помощью указания запроса OPTION (RECOMPILE) можно вынудить оптимизатор запросов повторно компилировать план запроса при каждом выполнении одного и того же запроса. В этом случае оптимизатор будет иметь точные оценки количества элементов для GETDATE(), что позволит ему сформировать более эффективный план запроса.
Примеры
В следующих примерах с помощью шести системных функций SQL Server, которые возвращают текущую дату и время, происходит возврат даты, времени или и того и другого. Значения возвращаются последовательно и поэтому могут различаться на доли секунды.
A. Получение текущей системной даты и времени
Б. Получение текущей системной даты
В. Получение текущего системного времени
Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)
В приведенных ниже примерах с помощью трех системных функций SQL Server, которые возвращают текущую дату и время, происходит получение даты, времени или и того и другого. Значения возвращаются последовательно и поэтому могут различаться на доли секунды.
DATEADD (Transact-SQL)
Эта функция добавляет указанное значение number (целое число со знаком) к заданному аргументу datepart входного значения date, а затем возвращает это измененное значение.
Обзор всех типов данных и функций даты и времени в языке Transact-SQL см. в статье Типы данных и функции даты и времени (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 DATEADD будет принимать столбец выражения, выражение, строковый литерал или определяемую пользователем переменную. Значение строкового литерала должно разрешаться в datetime. Во избежание неоднозначности используйте четырехзначную запись года. Сведения о двузначном обозначении года см. в статье Настройка параметра конфигурации сервера two digit year cutoff.
Типы возвращаемых данных
Возвращаемое значение
Аргумент datepart
Функции dayofyear, day и weekday возвращают одинаковое значение.
Каждое выражение datepart и его краткие формы возвращают одно и то же значение.
Если верны следующие условия:
то 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 действуют указанные ниже условия.
Remarks
Используйте DATEADD в следующих предложениях.
Точность в долях секунды
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
Частичный результирующий набор имеет следующий вид:
Указание пользовательских переменных в качестве аргументов number и date
В этом примере в качестве аргументов number и date указываются пользовательские переменные.
Указание в качестве аргумента date скалярной системной функции
Указание в качестве аргументов number и date скалярных вложенных запросов и скалярных функций
Указание в качестве аргументов number и date числовых выражений и скалярных системных функций
Указание в качестве аргумента number ранжирующих функций
В этом примере в качестве аргумента number используется ранжирующая функция.
Указание в качестве аргумента number статистической оконной функции
В этом примере в качестве аргумента number используется агрегатная оконная функция.
Sql getdate минус день
This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.
Answered by:
Question
return the same result which surprises me. The first query is clearly dealing with days and, apparently, the «-1» in the second is interpreted as the number of days too. Where is that conversion feature documented?
P.S. I’d bet these won’t return the same result
Answers
I’m not sure it is documented. In any case, it certainly perfect nonsense.
int has lower precedence than datetime, so 1 gets converted to 1900-01-02, midnight. Now you have:
Which logically is of course not very meaningful. But since the underlying representation for datetime is a decimal number «it just works».
However, if you try:
Msg 206, Level 16, State 2, Line 1
Operand type clash: datetime2 is incompatible with int
For the new date/time data types added in SQL 2008, there is no implicit converion from int, and there is no addition or subtraction for the values.
GETDATE (Transact-SQL)
Returns the current database system timestamp as a datetime value without the database time zone offset. This value is derived from the operating system of the computer on which the instance of SQL Server is running.
SYSDATETIME and SYSUTCDATETIME have more fractional seconds precision than GETDATE and GETUTCDATE. SYSDATETIMEOFFSET includes the system time zone offset. SYSDATETIME, SYSUTCDATETIME, and SYSDATETIMEOFFSET can be assigned to a variable of any of the date and time types.
Azure SQL Database (with the exception of Azure SQL Managed Instance) and Azure Synapse Analytics follow UTC. Use AT TIME ZONE in Azure SQL Database or Azure Synapse Analytics if you need to interpret date and time information in a non-UTC time zone.
For an overview of all Transact-SQL date and time data types and functions, see Date and Time Data Types and Functions (Transact-SQL).
Transact-SQL Syntax Conventions
Syntax
Return Type
datetime
Remarks
Transact-SQL statements can refer to GETDATE anywhere they can refer to a datetime expression.
GETDATE is a nondeterministic function. Views and expressions that reference this function in a column cannot be indexed.
Using SWITCHOFFSET with the function GETDATE() can cause the query to run slowly because the query optimizer is unable to obtain accurate cardinality estimates for the GETDATE value. We recommend that you precompute the GETDATE value and then specify that value in the query as shown in the following example. In addition, use the OPTION (RECOMPILE) query hint to force the query optimizer to recompile a query plan the next time the same query is executed. The optimizer will then have accurate cardinality estimates for GETDATE() and will produce a more efficient query plan.
Examples
The following examples use the six SQL Server system functions that return current date and time to return the date, time, or both. The values are returned in series; therefore, their fractional seconds might be different.
A. Getting the current system date and time
Here is the result set.
B. Getting the current system date
Here is the result set.
C. Getting the current system time
Here is the result set.
Examples: Azure Synapse Analytics and Analytics Platform System (PDW)
The following examples use the three SQL Server system functions that return current date and time to return the date, time, or both. The values are returned in series; therefore, their fractional seconds might be different.
Лучший подход для удаления части времени datetime в SQL Server
какой метод обеспечивает лучшую производительность при удалении части времени из поля datetime в SQL Server?
второй метод отправляет еще несколько байтов в любом случае, но это может быть не так важно, как скорость преобразования.
оба также кажутся очень быстрыми, но может быть разница в скорости при работе с сотнями тысяч или более строк?
кроме того, возможно, что там есть ли еще лучшие методы, чтобы избавиться от временной части datetime в SQL?
23 ответов:
строго, метод a является наименее ресурсоемким:
доказано, что менее интенсивный процессор для той же общей продолжительности миллион строк кем-то с слишком большим количеством времени на руках: самый эффективный способ в SQL Server, чтобы получить дату от даты+времени?
Я видел подобный тест в другом месте с аналогичными результатами тоже.
Я предпочитаю DATEADD / DATEDIFF, потому что:
Edit, Oct 2011
Edit, Jan 2012
Edit, Май 2012
Не используйте это в предложениях WHERE и т. п., не думая: добавление функции или приведения к столбцу делает недействительным использование индекса. Смотрите номер 2 здесь: http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/
Edit, Sep 2018, for datetime2
в SQL Server 2008 можно использовать:
конечно, это старый поток, но чтобы сделать его полным.
из SQL 2008 Вы можете использовать тип данных даты, так что вы можете просто сделать:
в SQL Server 2008 существует тип данных DATE (также тип данных TIME).
этот метод магических чисел работает немного быстрее, чем метод DATEADD. (Похоже на
процессорное время на несколько раундов миллиона записей:
но обратите внимание, что эти цифры, возможно, не имеют значения, потому что они уже очень быстро. Если у меня не было наборов записей 100 000 или более, я даже не мог получить время процессора для чтения выше нуль.
учитывая тот факт, что DateAdd предназначен для этой цели и является более надежным, я бы сказал, использовать DateAdd.
время прокладки на вставках / обновлениях в первую очередь. Что касается преобразования «на лету», ничто не может превзойти пользовательскую функцию maintanability-wise:
Что бы ты ни делал,не используйте метод String. Это самый худший способ сделать это.
уже ответил, но я брошу это там тоже. это suposedly также преформирует хорошо, но он работает, отбрасывая десятичное число (которое хранит время) из поплавка и возвращая только целую часть (которая является датой)
этот метод не использовать строковые функции. Date это в основном реальный тип данных с цифрами до десятичной дроби в день.
это, я думаю, будет быстрее, чем много.
для меня приведенный ниже код всегда является победителем:
метод А) и б) не всегда есть же выход!
выход: 2014-01-01 00:00:00.000
выход: 2013-12-31 00:00:00.000
(проверено на MS SQL Server 2005 и 2008 R2)
EDIT: согласно комментарию Адама, это не может произойти, если Вы читаете значение даты из таблицы, но это может произойти, если вы предоставите свое значение даты как литерал (пример: как параметр хранимой процедуры, вызываемой через ADO.NET).
выберите конвертировать(char (10), GetDate (), 126)
The 120 формат кода принудит дату в стандарт ISO 8601:
супер простой в использовании в dplyr ( R ) и панды ( Python )!
Я думаю, что вы имеете в виду cast(floor(cast(getdate()as float))as datetime)
реальный только 32-бит, и может потерять некоторую информацию
Это самый быстрый cast(cast(getdate()+x-0.5 as int)as datetime)
. хотя только около 10% быстрее (about 0.49 microseconds CPU vs. 0.58)
Это было рекомендовано, и занимает то же время в моем тесте только сейчас: DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
в SQL 2008 функция SQL CLR примерно в 5 раз быстрее, чем при использовании функции SQL, в 1,35 микросекунды против 6,5 микросекунд, что указывает на гораздо более низкий вызов функции накладные расходы для функции SQL CLR по сравнению с простым SQL UDF.
в SQL 2005 функция SQL CLR в 16 раз быстрее, в соответствии с моим тестированием, по сравнению с этой медленной функцией:
Я думаю, что если вы строго придерживаетесь TSQL что это самый быстрый способ сократить время:
я обнаружил, что этот метод усечения примерно на 5% быстрее, чем DateAdd метод. И это можно легко изменить, чтобы округлить до ближайшего дня следующим образом:
здесь я сделал функцию для удаления некоторых частей datetime для SQL Server. Использование:
create function dbo.uf_RoundDateTime(@dt as datetime, @part as char) returns datetime as begin if CHARINDEX( @part, ‘smhd’,0) = 0 return @dt; return cast( Case @part when ‘s’ then convert(varchar(19), @dt, 126) when ‘m’ then convert(varchar(17), @dt, 126) + ’00’ when ‘h’ then convert(varchar(14), @dt, 126) + ’00:00′ when ‘d’ then convert(varchar(14), @dt, 112) end as datetime ) end
на всякий случай, если кто-то ищет здесь версию Sybase, так как несколько версий выше не работали
Если возможно, для особых вещей, подобных этому, мне нравится использовать функции CLR.
на самом деле, для большинства баз данных, которые я создаю, я добавляю эти UDF в самом начале, так как я знаю есть 99% шанс, что они мне понадобятся рано или поздно.
Я создаю один для » только дата «и» только время «(хотя» только дата » один, безусловно, наиболее часто используется из двух).
вот некоторые ссылки на различные даты, связанные с UDF:
эта последняя ссылка показывает не менее 3 различных способов получения даты только часть поле DateTime и упоминает некоторые плюсы и минусы каждого подхода.
при использовании UDF следует отметить, что вы должны стараться избегать использования UDF как части предложения WHERE в запросе, поскольку это значительно затруднит выполнение запроса. Основная причина этого заключается в том, что использование UDF в предложении WHERE отображает это предложение как non-sargable, что означает, что SQL Server больше не может использовать индекс с этим предложением для повышения скорости выполнения запроса. С ссылаясь на мое собственное использование UDF, я часто буду использовать столбец «raw» date в предложении WHERE, но применяю UDF к выбранному столбцу. Таким образом, UDF применяется только к отфильтрованному результирующему набору, а не к каждой строке таблицы в составе фильтра.
конечно, абсолютная лучшие подход для этого должен использовать SQL Server 2008 (или выше) и выделить свои дата и время, так как SQL Server database engine является изначально предоставление отдельных компонентов даты и времени и может эффективно запрашивать их независимо без необходимости использования UDF или другого механизма для извлечения части даты или времени из составного типа datetime.