Самый эффективный способ преобразования формата DateTime в 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) 

Какой самый эффективный способ сделать это?

Ответ 1

Ваш пример cast(convert(char(8), orderdate, 112) as int) кажется мне прекрасным. Он быстро получает дату до нужного формата и преобразуется в int.

С точки зрения плана выполнения, между ними нет никакой разницы.

Ответ 2

Вы можете попробовать с помощью встроенных функций 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

Ответ 3

Это то, что вам нужно

SELECT REPLACE(CONVERT(VARCHAR(10),'2010-01-01 00:00:00.000',101),'-','')

Ответ 4

Когда вы передаете "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'