Date (transact-sql)

Обратная совместимость для клиентов нижнего уровня

Некоторые клиенты нижнего уровня не поддерживают типы данных time, date, datetime2 и datetimeoffset. В следующей таблице показано сопоставление типов экземпляра более высокого уровня SQL Server и клиентов низкого уровня.

Тип данных SQL Server Формат строкового литерала по умолчанию, передаваемый клиенту низкого уровня ODBC низкого уровня OLEDB низкого уровня JDBC низкого уровня SQLCLIENT низкого уровня
time чч:мм:сс SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString
date ГГГГ-ММ-ДД SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString
datetime2 ГГГГ-ММ-ДД чч:мм:сс SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString
datetimeoffset ГГГГ-ММ-ДД чч:мм:сс чч:мм SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString

Format for Inserting the date

While you can display the date in any formats, you need to be careful while inserting the date in the database.

This is because, the date  can be interpreted as 5th of march or 3rd May depending on where you live.

YYYYMMDD Universal format

Always use the format to insert the date into database. This is the default format that SQL Server uses. It is also the safe format and can be interpreted only in one way.

1
2
3
4
5
6
7
8
9
10
11
12

Insert into testTable(colDefault)

values(‘2020-12-15 15:40:45.2756145’)

Insert into testTable(colDefault)

values(‘2020.12.15 15:40:45.2756145’)

Insert into testTable(colDefault)

values(‘2020/12/15 15:40:45.2756145’)

Insert into testTable(colDefault)

values(‘20201215 15:40:45.2756145’)

Insert into testTable(colDefault)

values(‘2020-5-2 15:40:45.2756145’)

 

The following query will run without error irrespective of the language or DATEFORMAT used by the SQL Server

Language Settings

The language settings also determines the date formats, that you can use to insert the date values.

To find out the current language, run the TSQL command and note down the language.

1
2
3

select@@language;

 

Next, run the  to procedure. Look for the value of  column.

1
2
3

exec sp_helplanguage

 

The format may one of ,  & .

IF format is , then you can insert the value . But if the format is  it will result in an error.

Using DATEFORMAT

You can also use the DATEFORMAT to set the format to ,  & . The setting will work only for the current session. When a new session starts the DATEFORMAT revert back to the default.

For Example, the following queries will work if the format is .

1
2
3
4
5
6
7
8
9

SETDATEFORMAT’mdy’

Insert into testTable(colDefault)values(’12-15-2020 15:40:45.2756145′)

Insert into testTable(colDefault)values(‘12.15.2020 15:40:45.2756145’)

Insert into testTable(colDefault)values(’12/15/2020 15:40:45.2756145′)

 
 

But if the format is , then it will result is error

Two digit year

The year part can be specified either as four digit or two-digit years. 

Always use four-digit years. The SQL Server may interpret 2 digit year wrongly as shown in the following example.

1
2
3
4
5
6
7
8
9
10
11
12
13
14

SETDATEFORMAT’dmy’

Insert into testTable(colDefault)values(’20-12-15 15:40:45.2756145′)

SETDATEFORMAT’ymd’

Insert into testTable(colDefault)values(’20-12-15 15:40:45.2756145′)

select*from testTable

2015-12-20154045.2756145

2020-12-15154045.2756145

 

For two digits year, the cut of year is 2049 and the time span is from 1950 to 2049.

Hence the years from 50 to 99 is treated as 1950 to 1999. And the year from 00 to 49 is treated as 2000 to 2049.

You can change the cutoff year using the two digit year cutoff option

Преобразование данных

Последнее обновление: 29.07.2017

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

datetime
smalldatetime
float
real
decimal
money
smallmoney
int
smallint
tinyint
bit
nvarchar
nchar
varchar
char

То есть SQL Server автоматически может преобразовать число 100.0 (float) в дату и время (datetime).

В тех случаях, когда необходимо выполнить преобразования от типов с высшим приоритетом к типам с низшим приоритетом, то надо выполнять явное приведение типов.
Для этого в T-SQL определены две функции: CONVERT и CAST.

Функция CAST преобразует выражение одного типа к другому. Она имеет следующую форму:

CAST(выражение AS тип_данных)

Для примера возьмем следующие таблицы:

CREATE TABLE Products
(
    Id INT IDENTITY PRIMARY KEY,
    ProductName NVARCHAR(30) NOT NULL,
    Manufacturer NVARCHAR(20) NOT NULL,
    ProductCount INT DEFAULT 0,
    Price MONEY NOT NULL
);
CREATE TABLE Customers
(
    Id INT IDENTITY PRIMARY KEY,
    FirstName NVARCHAR(30) NOT NULL
);
CREATE TABLE Orders
(
    Id INT IDENTITY PRIMARY KEY,
    ProductId INT NOT NULL REFERENCES Products(Id) ON DELETE CASCADE,
    CustomerId INT NOT NULL REFERENCES Customers(Id) ON DELETE CASCADE,
    CreatedAt DATE NOT NULL,
    ProductCount INT DEFAULT 1,
    Price MONEY NOT NULL
);

Например, при выводе информации о заказах преобразует числовое значение и дату в строку:

SELECT Id, CAST(CreatedAt AS nvarchar) + '; total: ' + CAST(Price * ProductCount AS nvarchar) 
FROM Orders

Convert

Большую часть преобразований охватывает функция CAST. Если же необходимо какое-то дополнительное форматирование, то можно использовать функцию CONVERT. Она имеет следующую форму:

CONVERT(тип_данных, выражение )

Третий необязательный параметр задает стиль форматирования данных. Этот параметр представляет числовое значение, которое для разных типов данных имеет разную интерпретацию.
Например, некоторые значения для форматирования дат и времени:

  • или — формат даты «Mon dd yyyy hh:miAM/PM» (значение по умолчанию)

  • или — формат даты «mm/dd/yyyy»

  • или — формат даты «dd/mm/yyyy»

  • или — формат даты «Mon dd, yyyy hh:miAM/PM»

  • или — формат даты «hh:mi:ss»

  • или — формат даты «mm-dd-yyyy»

  • или — формат даты «hh:mi:ss:mmmm» (24-часовой формат времени)

Некоторые значения для форматирования данных типа money в строку:

  • — в дробной части числа остаются только две цифры (по умолчанию)

  • — в дробной части числа остаются только две цифры, а для разделения разрядов применяется запятая

  • — в дробной части числа остаются только четыре цифры

SELECT CONVERT(nvarchar, CreatedAt, 3), 
	   CONVERT(nvarchar, Price * ProductCount, 1) 
FROM Orders

TRY_CONVERT

При использовании функций CAST и CONVERT SQL Server выбрасывает исключение, если данные нельзя привести к определенному типу. Например:

SELECT CONVERT(int, 'sql')

Чтобы избежать генерации исключения можно использовать функцию TRY_CONVERT. Ее использование аналогично функции CONVERT за тем исключением, что
если выражение не удается преобразовать к нужному типу, то функция возвращает NULL:

SELECT TRY_CONVERT(int, 'sql')		-- NULL
SELECT TRY_CONVERT(int, '22')		-- 22

Дополнительные функции

Кроме CAST, CONVERT, TRY_CONVERT есть еще ряд функций, которые могут использоваться для преобразования в ряд типов:

  • STR(float ]): преобразует число в строку. Второй параметр указывает на длину строки, а третий — сколько знаков в дробной части числа надо оставлять

  • CHAR(int): преобразует числовой код ASCII в символ. Нередко используется для тех ситуаций, когда необходим символ, который нельзя ввести с клавиатуры

  • ASCII(char): преобразует символ в числовой код ASCII

  • NCHAR(int): преобразует числовой код UNICODE в символ

  • UNICODE(char): преобразует символ в числовой код UNICODE

SELECT STR(123.4567, 6,2)	-- 123.46
SELECT CHAR(219)			--  Ы
SELECT ASCII('Ы')			-- 219
SELECT NCHAR(1067)			-- Ы
SELECT UNICODE('Ы')		-- 1067

НазадВперед

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

Значение типа int, представляющее разницу между аргументами startdate и enddate в границах, определяемых аргументом datepart.

Например, возвращает значение -2, указывая на то, что 2036 – високосный год. Это означает, что, если начать со startdDate «2036-03-01» и отсчитать -2 дня, будет достигнуто значение enddate «2036-02-28».

В качестве возвращаемого значения вне диапазона для int (от –2 147 483 648 до 2 147 483 647) возвращает сообщение об ошибке. Для миллисекунды максимальная разница между startdate и enddate составляет 24 дня 20 часов 31 минута и 23 647 секунд. Для секунды максимальная разница составляет 68 лет, 19 дней, 3 часа, 14 минут и 7 секунд.

Если обоим аргументам, startdate и enddate, присвоено только значение времени, а аргумент datepart не содержит значения времени datepart, то возвращает значение 0.

При вычислении возвращаемого значения использует компонент смещения часовых поясов для аргументов startdate или enddate.

Так как значение типа smalldatetime имеет точность до минуты, то при использовании в аргументах startdate и enddate значений типа smalldatetime секунды и миллисекунды у возвращаемых значений всегда равны 0.

Если переменной типа данных date присвоено только значение времени, в качестве недостающей части даты задает значение по умолчанию: . Если переменной типа данных time или date присвоено только значение даты, в качестве недостающей части времени задает значение по умолчанию: . Если в одном из аргументов startdate или enddate указано только время, а в другом только дата, в качестве недостающей информации задает значения по умолчанию.

Если аргументы startdate и enddate имеют разные типы данных даты, но при этом один из них имеет больше частей времени или обладает более высокой точностью, присваивает значения 0 недостающим частям другого аргумента.

Remarks

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

Функция неявно приводит строковые литералы к типу datetime2. Это означает, что не поддерживает формат ГЧМ (год, число, месяц) при передаче даты в виде строки. Для использования формата ГЧМ (год, число, месяц) необходимо явно привести строку к типу datetime или smalldatetime.

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

может переполняться с точностью до минуты или более низкой точностью, если разница между enddate и startdate представляет собой значение, выходящее за пределы диапазона, допустимого для int.

Alternative Formats

Last, I will share examples of alternative formats for returning dates.
Also, I will show how robust SQL is at converting the other formats when used in
a where clause.

--A. Alternative formats that returns Year Month Day mixing Date and Datetime formats using CONVERT:
SELECT CONVERT(CHAR(10),,120) as 'MyDate_w_Dash',
       CONVERT(CHAR(10),,111) as 'MyDateTime_w_Slash',
       CONVERT(CHAR(10),,102) as 'MyDateTime_w_Dot'
FROM .;

--B. Alternative formates that returs Year Month Day mixing Date and Datetime formats using FORMAT:
SELECT FORMAT(,'yyyy-MM-dd') as 'MyDate_w_Dash',
       FORMAT(,'yyyy/MM/dd') as 'MyDate_w_Slash',
       FORMAT(,'yyyy.MM.dd') as 'MyDateTime_w_Dot'
FROM .;
 
--C. Note using Year, month, day in the where clause that SQL server will recognize different delimiters: dash, slash, dot or no delimiter as shown above.
SELECT *
FROM .
WHERE  = '2020.01.01' --or '2020/01/01' or '2020-01-01' or '20200101'
;

Results: Review the 3 result sets from the queries! Note
the different date delimiters and the ability to use different delimited dates as
filters.

Поддерживаемые форматы строковых литералов для типа данных datetime

В представленных ниже таблицах приводятся поддерживаемые форматы строковых литералов для типа данных datetime. За исключением ODBC, строковые литералы типа datetime заключаются в одинарные кавычки (‘), например ‘string_literaL’. Если язык среды не us_english, строковые литералы должны иметь формат N’string_literaL’.

Числовой Описание
Форматы даты 4/15/96 — (мдг) 4-15-96 — (мдг) 4.15.96 — (мдг) 4/96/15 — (мгд) 15/4/96 — (дмг) 15/96/4 — (дгм) 96/15/4 — (гдм) 96/4/15 — (гмд) Форматы времени 14:30 14:30 14:30 4am 16:00:00 Месяц в датах может указываться в числовом формате. Например, 5/20/97 обозначает двадцатое мая 1997 года. Используя числовой формат дат, указывайте месяц, день и год в виде строки со знаками косой черты (/), дефисами (-) или точками (.) в качестве разделителей. Эта строчка должна выглядеть следующим образом:число разделитель число разделитель число При использовании языковой настройки us_english порядком по умолчанию для даты является mdy (МДГ). Порядок даты можно изменить с помощью инструкции SET DATEFORMAT. Установка для SET DATEFORMAT определяет, как будут интерпретированы значения дат. Если порядок не соответствует конфигурации, значения не обрабатываются как даты. Неупорядоченные даты могут неправильно интерпретироваться как даты за пределами диапазона или даты с неправильными значениями. Например, 12/10/08 может быть интерпретировано как одна из шести различных дат в зависимости от установки DATEFORMAT. Четырехзначный год интерпретируется как год.
Алфавитный формат Описание
Apr 1996 Apr 15 96 Apr 1996 Apr 1996 15 Apr96 15 96 apr 1996 apr 1996 APR 1996 APR Можно указывать дату с полным именем месяца. Например, «апрель» или сокращение «Апр», заданное в текущем языке. Запятые не обязательны, регистр букв не учитывается. Некоторые рекомендации по применению алфавитных форматов даты: 1. Заключайте дату и время в одинарные кавычки (‘). Для всех языков, кроме английского, используйте «N’». 2. Символы, заключенные в квадратные скобки, являются необязательными. 3. Если указать две последние цифры года, значения, меньшие двух последних цифр значения параметра конфигурации сервера two digit year cutoff, будут относиться к столетию года усечения. Значения, большие или равные двум последним цифрам этого параметра, относятся к столетию, предшествующему столетию года усечения. Например, если значение параметра two digit year cutoff равно 2050 (по умолчанию), то год, обозначенный двумя цифрами 25, интерпретируется как 2025, а год, обозначенный двумя цифрами 50, — как 1950. Во избежание неоднозначности используйте четырехзначную запись года. 4. Если не указано число месяца, подразумевается первое число месяца. Параметр сеанса SET DATEFORMAT не применяется, если месяц указывается в алфавитном формате.
ISO 8601 Описание
ГГГГ-ММ-ДДТчч:мм:сс ГГГГММДД] Примеры: 1. 2004-05-23T14:25:10 2. 2004-05-23T14:25:10.487 Чтобы использовать формат ISO 8601, необходимо указать каждый элемент в этом формате, включая T, двоеточие (:) и точку (.), которые отображаются в этом формате. Квадратные скобки показывают, что доли секунд не являются обязательными. Временной компонент указан в 24-часовом формате. Символ T указывает на начало временной части значения datetime. Преимущество формата ISO 8601 заключается в том, что он является международным стандартом с однозначным представлением. Кроме того, на этот формат не влияют настройки SET DATEFORMAT и SET LANGUAGE.
Без разделителей Описание
ГГГГММДД чч:мм:сс
ODBC Описание
{ ts ‘1998-05-02 01:23:56.123’ } { d ‘1990-10-02′ } { t ’13:33:41’ } Интерфейс API ODBC определяет управляющие последовательности, представляющие значения даты и времени, называемые в ODBC метками времени. Этот формат меток времени ODBC также поддерживается определением языка OLE DB (DBGUID-SQL), поддерживаемым поставщиком Microsoft OLE DB для SQL Server. Приложения, использующие ADO, OLE DB или API-интерфейсы, основанные на ODBC, могут использовать этот формат отметок времени ODBC для представления даты и времени. Escape-последовательности меток времени ODBC имеют следующий формат: { literal_type ‘constant_value’ }: — literal_type определяет тип escape-последовательности. Метки времени имеют три описателя literal_type:1) d = только дата2) t = только время3) ts = метка времени (время + дата) — ‘constant_value’ является значением escape-последовательности. Значение constant_value должно соответствовать этим форматам для каждого literal_type.d : гггг-мм-ддt : чч:мм:ссts : гггг-мм-дд чч:мм:сс

Определение значений даты и времени в качестве литералов

Вы можете указать типы данных даты и времени, используя множество различных форматов строк литералов, которые SQL Server затем оценивает во время выполнения, преобразовывая их во внутренние структуры даты и времени. SQL Server распознает данные даты и времени, заключенные в одинарные кавычки (‘). Некоторые форматы продемонстрированы в следующих примерах.

  • Буквенные форматы даты, такие как .

  • Числовые форматы даты, такие как .

  • Неразделенные форматы строк, например строка , которая будет интерпретироваться как 15 октября 2006 г., если вы используете формат даты по стандарту ISO.

Примечание

Вы можете найти полную документацию по всем форматам строк литералов и другим функциям типов данных даты и времени в электронной документации на SQL Server.

Значения времени, которые меньше нуля, больше или равны 24 часам, вызовут исключение ArgumentException.

Implicit Conversion

This is one important aspect you must aware of when you are converting from DateTime to DateTime2.

SQL Server automatically tries to convert one data type to another during evaluation of expressions. This is known as Implicit conversion and it is not visible to the user.

In case of Expressions involving DateTime & numeric data types, SQL Server does an implicit data conversion. For Example in the following expression will result incrementing date by 1.

1
2
3
4
5
6
7
8

Declare@Dt asDateTime

Set@Dt=’2020-12-26′

Select@Dt+1

 
————————

2020-12-27000000.000

 

Implicit conversion does not happen between DateTime2 & numeric Data types. The following query will result in an error.

1
2
3
4
5
6
7
8

Declare@Dt asDateTime2

Set@Dt=’2020-12-26′

Select@Dt+1

 
——————————————————

Operand type clashdatetime2 isincompatible with int

 

You may need to rewrite all such queries. In the above example, you can make use of the DateAdd function.

1
2
3
4
5
6
7
8
9

Declare@Dt asDateTime2

Set@Dt=’2020-12-26′

Select Dateadd(«d»,1,@Dt)

 
 
————————

2020-12-27000000.000

 

Convert Dates to Char ‘yyyymmdd’

Next, converting a DATE and DATETIME datatype to character 8 ‘yyyymmdd’
output using
CONVERT and
FORMAT functions.

--A. CONVERT use style = 112 to CHAR 8 or NCAHR 8
SELECT CONVERT(CHAR(8),,112) as 'MyDate',CONVERT(CHAR(8),,112) as 'MyDateTime'
FROM .;
 
--B. NCHAR(8)
SELECT CONVERT(NCHAR(8),,112) as 'MyDate',CONVERT(NCHAR(8),,112) as 'MyDateTime'
FROM .;
 
--C. FORMAT Function (new in SQL 2012) use format = yyyyMMdd returning the results as nvarchar.
SELECT FORMAT(,'yyyyMMdd') as 'MyDate', FORMAT(,'yyyyMMdd')  as 'MyDateTime'
FROM .; 

Results: The results of the 3 queries all show the conversion
to ‘yyyymmdd’ regardless of the format or the conversion method. The
results below were reduced to 3 rows each for the demo.

Inserting Date & Time

In the following query, we insert the date to all the columns.

1
2
3
4
5
6
7
8
9

Insert into TestTable

(colDefault,col0,col1,col2,col3,col4,col5,col6,col7)

Values(‘2020-12-23 15:40:45.2756145′,’2020-12-23 15:40:45.2756145′,’2020-12-23 15:40:45.2756145’,

‘2020-12-23 15:40:45.2756145′,’2020-12-23 15:40:45.2756145′,’2020-12-23 15:40:45.2756145’,

‘2020-12-23 15:40:45.2756145′,’2020-12-23 15:40:45.2756145′,’2020-12-23 15:40:45.2756145’)

 

You can see that fractional second is rounded off and truncated according to the column definition.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Select*from TestTable

 
//Output
 

colDefault02020-12-23154045.2756145

col02020-12-23154045

col12020-12-23154045.3

col22020-12-23154045.28

col32020-12-23154045.276

col42020-12-23154045.2756

col52020-12-23154045.27561

col62020-12-23154045.275615

col72020-12-23154045.2756145

 

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

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

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

Converting Date and Time Data

When you convert to date and time data types, SQL Server rejects all values it can’t recognize as dates or times. For information about using the CAST and CONVERT functions with date and time data, see CAST and CONVERT (Transact-SQL).

Converting Other Date and Time Types to the datetime Data Type

This section describes what occurs when other date and time data types are converted to the datetime data type.

When the conversion is from date, the year, month, and day are copied. The time component is set to 00:00:00.000. The following code shows the results of converting a value to a value.

When the conversion is from time(n), the time component is copied, and the date component is set to ‘1900-01-01’. When the fractional precision of the time(n) value is greater than three digits, the value will be truncated to fit. The following example shows the results of converting a value to a value.

When the conversion is from smalldatetime, the hours and minutes are copied. The seconds and fractional seconds are set to 0. The following code shows the results of converting a value to a value.

When the conversion is from datetimeoffset(n), the date and time components are copied. The time zone is truncated. When the fractional precision of the datetimeoffset(n) value is greater than three digits, the value will be truncated. The following example shows the results of converting a value to a value.

When the conversion is from datetime2(n), the date and time are copied. When the fractional precision of the datetime2(n) value is greater than three digits, the value will be truncated. The following example shows the results of converting a value to a value.

Типы данных и параметры даты и времени

Для поддержки новых типов данных даты и времени к свойству SqlDbType были добавлены следующие значения перечисления.

Можно указать тип данных SqlParameter с помощью одного из предшествующих перечислений SqlDbType.

Примечание

Вы не можете установить для свойства параметра значение .

Также можно указать тип объекта SqlParameter в общей форме, задав для свойства DbType объекта особое значение перечисления DbType. Для поддержки типов данных и к свойству DbType были добавлены следующие значения перечисления.

  • DbType.DateTime2.

  • DbType.DateTimeOffset.

Эти новые перечисления дополняют перечисления , и .

Тип поставщика данных Microsoft SqlClient для объекта параметра выводится из типа .NET значения объекта параметра или из объекта параметра. Для поддержки новых типов данных даты и времени не введено новых типов данных System.Data.SqlTypes. В приведенной ниже таблице описаны сопоставления между типами данных даты и времени SQL Server 2008 и типами данных CLR.

Тип данных SQL Server Тип .NET System.Data.SqlDbType System.Data.DbType
Дата System.DateTime Дата Дата
time System.TimeSpan Время Время
datetime2 System.DateTime datetime2 datetime2
datetimeoffset System.DateTimeOffset DateTimeOffset DateTimeOffset
DATETIME System.DateTime Дата и время Дата и время
smalldatetime System.DateTime Дата и время Дата/время

Свойства SqlParameter

В приведенной ниже таблице описаны свойства , которые относятся к типам данных даты и времени.

Свойство Описание
IsNullable Возвращает или задает допустимость значений NULL. Во время отправки значения NULL на сервер нужно указать DBNull, а не ( в Visual Basic). Дополнительные сведения о значении NULL базы данных см. в статье Handling null values (Обработка значений NULL).
Precision Возвращает или задает максимальное количество цифр, используемых для представления значения. Этот параметр не учитывается для типов данных даты и времени.
Scale Возвращает или задает число десятичных разрядов, до которых разрешается промежуток времени для , и . Значение по умолчанию равно 0. Это означает, что фактический масштаб выводится из значения и отправляется на сервер.
Size Не учитывается для типов данных даты и времени.
Value Возвращает или задает значение параметра.
SqlValue Возвращает или задает значение параметра.

Примечание

Значения времени, которые меньше нуля, больше или равны 24 часам, вызовут исключение ArgumentException.

Создание параметров

Вы можете создать объект SqlParameter, используя его конструктор или добавив его в коллекцию SqlCommand.Parameters путем вызова метода элемента SqlParameterCollection. Метод будет принимать в качестве входных данных аргументы конструктора либо имеющийся объект параметра.

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

Пример с DateTimeOffSet

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

AddWithValue

Вы также можете указать параметры, используя метод элемента SqlCommand, как показано в приведенном ниже фрагменте кода. Однако метод не позволяет указывать свойство DbType или SqlDbType для параметра.

Параметр можно сопоставить типу данных , или на сервере. При работе с новыми типами данных необходимо явно установить для свойства параметра SqlDbType тип данных экземпляра. Использование или неявное предоставление значений параметров может вызвать проблемы с обратной совместимостью с типами данных и .

В приведенной ниже таблице показано, какие типы выводятся из типов CLR.

Тип среды CLR Выводимый тип SqlDbType
Дата/время SqlDbType.DateTime
TimeSpan SqlDbType.Time
DateTimeOffset SqlDbType.DateTimeOffset

Обратная совместимость для клиентов нижнего уровня

Некоторые клиенты нижнего уровня не поддерживают типы данных time, date, datetime2 и datetimeoffset. В следующей таблице показано сопоставление типов экземпляра более высокого уровня SQL Server и клиентов низкого уровня.

Тип данных SQL Server Формат строкового литерала по умолчанию, передаваемый клиенту низкого уровня ODBC низкого уровня OLEDB низкого уровня JDBC низкого уровня SQLCLIENT низкого уровня
time чч:мм:сс SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString
date ГГГГ-ММ-ДД SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString
datetime2 ГГГГ-ММ-ДД чч:мм:сс SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString
datetimeoffset ГГГГ-ММ-ДД чч:мм:сс чч:мм SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString

Аргументы функции datepart, содержащие информацию о номере недели и дня

Для week (wk, ww) или weekday (dw) datepart возвращаемое значение зависит от значения, заданного функцией SET DATEFIRST.

1 января любого года определяет начальное число для компонента даты week datepart. Пример:

DATEPART (wk, ‘Jan 1, xxx x’) = 1,

где xxxx — любой год.

В этой таблице представлены возвращаемые значения параметров week и weekday datepart для даты 21.04.2007 с каждым аргументом функции SET DATEFIRST. 1 января 2007 г. приходится на понедельник. 21 апреля 2007 г. приходится на субботу. Для региональных настроек «Английский (США)»

SET DATEFIRST 7 (воскресенье). После задания DATEFIRST используйте предлагаемую инструкцию SQL для табличных значений datepart:

SET DATEFIRST — аргумент week возвращаемое weekday возвращаемое
1 16 6
2 17 5
3 17 4
4 17 3
5 17 2
6 17 1
7 16 7

DateTime2 Vs DateTime

The following table lists some of the major difference between DateTime2 vs DateTime.

  DateTime2 DateTime
Syntax datetime2(n) Where n is fractional seconds precision datetime
Usage DECLARE @MyDatetime2 datetime2(3) CREATE TABLE Table1 ( Column1 datetime2(7) ) DECLARE @MyDatetime datetime CREATE TABLE Table1 ( Column1 datetime )
ANSI SQL Compliant SQL Standards and is ISO Compliant (ISO 8601) No
Format YYYY-MM-DD hh-mm-ss.nnnnnnn YYYY-MM-DD hh-mm-ss.nnn
Date Range 0001-01-01 To 1999-12-31 1753-01-01 To 1999-12-31
Time Range 00:00:00 through 23:59:59.9999999 00:00:00 through 23:59:59.997
Accuracy .0000001 seconds (100 nano seconds ) Rounded to increments of .000, .003, or .007 seconds
User Defined Precision Yes No
Storage 6 to 8 Bytes (Depends on no of fractional position) n n =3 or n=4 7 Bytes n >=5 8 Bytes 8 Bytes
Time zone offset No No
Default Value 1900-01-01 00:00:00 1900-01-01 00:00:00
Implicit conversion number data types are implicitly converted to a DATETIME You need to do the explicit conversion
Base Date 0001-01-01 1900-01-01
How stored 4 Bytes for Date comes first & 4 Bytes for time comes later Times comes first ( 3 to 5 bytes) & 3 bytes for date which comes later Both time & Date stored in reverse order
Reference DateTime2 DateTime

Преобразование данных типа Date и Time

При преобразовании в типы данных даты и времени SQL Server отбрасывает все значения, которые не распознаются как значения даты или времени. Сведения об использовании функций CAST и CONVERT c данными типов даты и времени см. в статье Функции CAST и CONVERT (Transact-SQL).

Преобразование других типов даты и времени в тип данных datetime

В этом разделе описывается, что происходит при преобразовании других типов даты и времени в тип данных datetime.

При преобразовании из типа date копируются год, месяц и день. Для компонента времени устанавливается значение 00:00:00.000. Следующий код демонстрирует результаты преобразования значения в значение .

При преобразовании из time(n) компонент времени копируется, а для компонента даты устанавливается значение 1900-01-01. Если точность в долях секунды значения time(n) больше трех цифр, значение будет усечено. Следующий пример показывает результаты преобразования значения в значение .

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

При преобразовании из типа datetimeoffset(n) копируются компоненты даты и времени. Часовой пояс усекается. Если точность в долях секунды для значения datetimeoffset(n) превышает три разряда, значение будет усечено. Следующий пример показывает результаты преобразования значения в значение .

При преобразовании из типа datetime2(n) копируются дата и время. Если точность в долях секунды для значения datetime2(n) превышает три разряда, значение будет усечено. Следующий пример показывает результаты преобразования значения в значение .

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: