У меня есть столбец INT в моей таблице. Этот столбец сохраняет дату в специальном формате. Я пытаюсь преобразовать этот столбец в тип DATE.Преобразование числа на дату в SQL Server с исключением в конце месяца
Например, мы сохраняем '2016-03-14'
как 20160314
.
Исключение составляет, в течение последнего месяца, мы не храним день. Итак, для '2016-03-31'
мы храним 201603
, и я должен рассмотреть, является ли число less than 999999
или нет, чтобы указать число, которое представляет собой конец месяца или другие дни в месяце.
До сих пор, у меня есть 2 запросов для достижения этой задачи:
Запрос 1:
Это все математические формулы.
declare @k int = 20160321
--declare @k int = 201603
select
IIF(@k < 999999
, EOMONTH(DATEFROMPARTS(@k /100, @k % 100, 1), 0)
, DATEFROMPARTS(@k /10000, (@k/100) % 100, @k % 100)
)
Запрос 2: Это один использует манипуляции со строками.
declare @k int = 20160321
--declare @k int = 201603
select
IIF(@k < 999999
, EOMONTH(cast(LEFT(@k, 4) + '-' + RIGHT(@k, 2) + '-01' as date), 0)
, cast(LEFT(@k, 4) + '-' + RIGHT(LEFT(@k, 6), 2) + '-' + RIGHT(@k, 2) as date)
) AS DateColumn
мне нужно сделать формулы преобразования в WHERE
п. Что-то вроде:
SELECT K, Dt, Name -- and more fields
FROM tbl
WHERE IIF(K < 999999
, EOMONTH(DATEFROMPARTS(K /100, K % 100, 1), 0)
, DATEFROMPARTS(K /10000, (K/100) % 100, K % 100)
) < GetDate()
И performance is important
Вопрос: Есть ли лучший способ сделать это? Возможно, что SQL Server может использовать кластерный индекс, который у меня есть в столбце K.
@ hvd Он не является. Он использует функцию EOMONTH(), которая возвращает дату последнего дня месяца. –
@hvd - я думаю, что он получил это, называя функцию 'EOMONTH' –
Да, ребята. могут быть некоторые другие способы, очень похожие на то, что я сделал. случай зверя будет делать это, поэтому SQL Server может использовать кластерный индекс для столбца K. Я добавляю это к вопросу. – FLICKER