Ответ 1
Ваш пример cast(convert(char(8), orderdate, 112) as int)
кажется мне прекрасным. Он быстро получает дату до нужного формата и преобразуется в int.
С точки зрения плана выполнения, между ними нет никакой разницы.
Мне нужно преобразовать поля Datetime в специально форматированный тип INT. Например, я хочу
2000-01-01 00:00:00.000
для преобразования в 20010101
.
Каков наиболее эффективный способ сделать это преобразование для сравнения в запросе?
Что-то вроде:
DATEPART(year, orderdate) * 10000 + DATEPART(month, orderdate) * 100 +
DATEPART(day, orderdate)
или
cast(convert(char(8), orderdate, 112) as int)
Какой самый эффективный способ сделать это?
Ваш пример cast(convert(char(8), orderdate, 112) as int)
кажется мне прекрасным. Он быстро получает дату до нужного формата и преобразуется в int.
С точки зрения плана выполнения, между ними нет никакой разницы.
Вы можете попробовать с помощью встроенных функций TSQL. Он не совместим с .NET, но по-прежнему можно сортировать БЫСТРО, и вы можете выбрать ГРАНУЛЯРНОСТЬ по требованию:
SELECT setup.DateToINT(GETDATE(), 4) -- will output 2019 for 2019-06-06 12:00.456
SELECT setup.DateToINT(GETDATE(), 6) -- will output 201906 for 2019-06-06 12:00.456
SELECT setup.DateToINT(GETDATE(), 20) -- will output 20190606120045660 for 2019-05-05 12:00.456
CREATE FUNCTION setup.DateToINT(@datetime DATETIME, @length int)
RETURNS
BIGINT WITH SCHEMABINDING AS
BEGIN
RETURN CONVERT(BIGINT,
SUBSTRING(
REPLACE(REPLACE(
REPLACE(REPLACE(
CONVERT(CHAR(25), GETDATE(), 121)
,'-','')
,':','')
,' ','')
,'.','')
,0
,@length+1)
)
END
GO
Это то, что вам нужно
SELECT REPLACE(CONVERT(VARCHAR(10),'2010-01-01 00:00:00.000',101),'-','')
Когда вы передаете "2010-01-01 00: 00: 00.000" непосредственно в свой код, инструкция SELECT рассматривает его как строку, а не тип данных даты и времени. Это не то же самое, что непосредственно выбрать поле даты.
Нет необходимости делать внешний CAST, потому что SQL Server будет делать неявное преобразование, вот доказательство.
DECLARE @t DATETIME = '2010-01-10 00:00:00.000',@u INT
SELECT @u = CONVERT(CHAR(8), @t, 112)
IF ISNUMERIC(@u) = 1
PRINT 'Integer'