FOR Пример, если у меня есть:
DECLARE @Day int = 25
DECLARE @Month int = 10
DECLARE @Year int = 2016
Я хочу вернуться
2016-10-25
В качестве даты или даты и времени
FOR Пример, если у меня есть:
DECLARE @Day int = 25
DECLARE @Month int = 10
DECLARE @Year int = 2016
Я хочу вернуться
2016-10-25
В качестве даты или даты и времени
В SQL Server 2012+ вы можете использовать datefromparts()
:
select datefromparts(@year, @month, @day)
В более ранних версиях вы можете наложить строку. Вот один из способов:
select cast(cast(@year*10000 + @month*100 + @day as varchar(255)) as date)
В SQL Server 2012+ вы можете использовать DATEFROMPARTS
():
DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT DATEFROMPARTS (@Year, @Month, @Day);
В более ранних версиях одним из методов является создание и преобразование строки.
Существует несколько форматов строк, которые SQL Server достоверно интерпретирует независимо от настроек даты, языка или интернационализации.
Шесть или восьмизначная строка всегда интерпретируется как ymd. Месяц и день должен быть всегда двухзначным.
https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql
Таким образом, строка в формате "yyyymmdd" всегда будет правильно интерпретироваться.
(ISO 8601-- YYYY-MM-DDThh:mm:ss
- также работает, но вы должны указать время и, следовательно, сложнее, чем вам нужно.)
Пока вы можете просто CAST
эту строку в качестве даты, вы должны использовать CONVERT
, чтобы указать стиль, и вы должны указать стиль, чтобы быть детерминированным (если это имеет для вас значение).
Формат "yyyymmdd" - это стиль 112, поэтому ваше преобразование выглядит следующим образом:
DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);
И это приводит к:
2016-10-25
Технически формат ISO/112/yyyymmdd работает даже с указанными другими стилями. Например, используя этот текстовый формат со стилем 104 (немецкий, dd.mm.yyyy):
DECLARE @Year int = 2016, @Month int = 10, @Day int = 25;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),104);
Также по-прежнему получается:
2016-10-25
Другие форматы не такие надежные. Например:
SELECT CASE WHEN CONVERT(date,'01-02-1900',110) = CONVERT(date,'01-02-1900',105) THEN 1 ELSE 0 END;
Результаты в:
0
В качестве побочного примечания, с помощью этого метода, будьте осторожны, что входы бессмысленного ввода могут давать допустимые, но неправильные даты:
DECLARE @Year int = 2016, @Month int = 0, @Day int = 1025;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);
Также дает:
2016-10-25
DATEFROMPARTS
защищает вас от недопустимых входов. Это:
DECLARE @Year int = 2016, @Month int = 10, @Day int = 32;
SELECT DATEFROMPARTS (@Year, @Month, @Day);
Урожайность:
Msg 289, Уровень 16, Состояние 1, Строка 2 Невозможно создать дату типа данных, некоторые из аргументов имеют недопустимые значения.
Также помните, что этот метод не работает для дат до 1000-01-01. Например:
DECLARE @Year int = 900, @Month int = 1, @Day int = 1;
SELECT CONVERT(date,CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),112);
Урожайность:
Msg 241, уровень 16, состояние 1, строка 2 Преобразование не удалось при преобразовании дату и/или время от символьной строки.
Это потому, что результирующая строка "9000101" не находится в формате "yyyymmdd" . Чтобы обеспечить правильное форматирование, вам придется прокладывать его с помощью ведущих нулей при жертве небольшого количества производительности. Например:
DECLARE @Year int = 900, @Month int = 1, @Day int = 1;
SELECT CONVERT(date,RIGHT('000' + CONVERT(varchar(50),(@Year*10000 + @Month*100 + @Day)),8),112);
Результаты в:
0900-01-01
Существуют другие методы, помимо преобразования строк. Некоторые из них приводятся в ответах на "Создать дату с T-SQL". Примечательный пример включает в себя создание даты путем добавления лет, месяцев и дней к "нулевой дате".
(Этот ответ был вдохновлен ответом Гордоном Линоффом, который я расширил и предоставил дополнительную документацию и примечания.)
Итак, вы можете попробовать это решение:
DECLARE @DAY INT = 25
DECLARE @MONTH INT = 10
DECLARE @YEAR INT = 2016
DECLARE @DATE AS DATETIME
SET @DATE = CAST(RTRIM(@YEAR * 10000 + @MONTH * 100 + @DAY) AS DATETIME)
SELECT REPLACE(CONVERT(VARCHAR(10), @DATE, 102), '.', '-') AS EXPECTDATE
Или вы можете попробовать это несколько строк кода:
DECLARE @DAY INT = 25
DECLARE @MONTH INT = 10
DECLARE @YEAR INT = 2016
SELECT CAST(RTRIM(@YEAR * 10000 +'-' + @MONTH * 100+ '-' + @DAY) AS DATE) AS EXPECTDATE
выберите convert (varchar (11), transfer_date, 106)
получил мне желаемый результат от даты, отформатированный как 07 марта 2018 г.
Мой столбец "transfer_date" является столбцом типа даты и времени, и я использую SQL Server 2017 на лазурном
СОЗДАТЬ ДАТУ, ИСПОЛЬЗУЯ МЕСЯЦ ГОД В SQL ::
DECLARE @FromMonth int=NULL,
@ToMonth int=NULL,
@FromYear int=NULL,
@ToYear int=NULL
/**Region For Create Date**/
DECLARE @FromDate DATE=NULL
DECLARE @ToDate DATE=NULL
SET @FromDate=DateAdd(day,0, DateAdd(month, @FromMonth - 1,DateAdd(Year, @FromYear-1900, 0)))
SET @ToDate=DateAdd(day,-1, DateAdd(month, @ToMonth - 0,DateAdd(Year, @ToYear-1900, 0)))
/**Region For Create Date**/
Следующий код должен работать на всех версиях сервера sql, которые я считаю:
SELECT CAST(CONCAT(CAST(@Year AS VARCHAR(4)), '-',CAST(@Month AS VARCHAR(2)), '-',CAST(@Day AS VARCHAR(2))) AS DATE)