Самый эффективный способ конвертировать DateTime в Int формат - PullRequest
10 голосов
/ 01 сентября 2010

Мне нужно преобразовать поля 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) 

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

Ответы [ 4 ]

22 голосов
/ 01 сентября 2010

Твой пример cast(convert(char(8), orderdate, 112) as int) мне подходит. Он быстро возвращает дату к нужному формату и преобразует в целое число.

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

0 голосов
/ 14 июня 2019

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

Когда вы передаете '2010-01-01 00: 00: 00.000' непосредственно в свой код, оператор SELECT смотрит на него как на строку, а не на тип данных datetime. Это не то же самое, что прямой выбор поля даты и времени.

Нет необходимости выполнять внешний 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'
0 голосов
/ 01 сентября 2010

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

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