Пользовательская последовательность ссылочного идентификатора на основе DateTime в Sql Query - PullRequest
0 голосов
/ 20 ноября 2018

Можно ли написать SQL-запрос, который возвращает 18315-0921

Результат основан на времени, где

18 означает 2018
315 означает день года
0921 означает настоящее время.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018
declare @TDATE as datetime2 = getdate();

select    Right('0' + CAST(YEAR(@TDATE) % 100 as varchar(2)) , 2) 
       +  RIGHT('00' + CAST(DATEPART(y,@TDATE) as varchar(3)) , 3)
       +  '-'
       + REPLACE(CONVERT(varchar(5),@TDATE, 114), ':', '');

, поэтому я получаю номер года в 2-х цифрах, беря модуль 100 года, например, 2014% 100 равен 14

, затем я изменяю его на строку сведущий '0', если необходимо

Чтобы получить номер дня в году, я использую DatePart с 'y', чтобы указать 'номер дня года', который дополняется до 2 цифрами, если необходимо.

Чтобы получить время, которое я конвертирую в чч: ми: сс: ммм, но сохраняя только первые 5 символов, я заменяю ':' ничем

0 голосов
/ 20 ноября 2018

По предложению @ Роба в комментариях вы можете сделать это с помощью: Пример

declare @myDateTime DateTime = getutcdate()

select format(@myDateTime, 'yy')
+ format(DatePart(dy, @myDateTime), '000')
+ format(@myDateTime, '-HHmm')

Однако, часть ddd недоступна таким образом, так как dddконвертируется в название дня недели, т.е. по документации .Тем не менее, вы можете использовать это для упрощения выше: Пример


Исходное решение:

Вот решение: Пример

declare @myDateTime DateTime = getutcdate()

--to get the component parts

select DatePart(YEAR, @myDateTime) - 2000 YY
, DateDiff(Day, DateFromParts(DatePart(YEAR, @myDateTime),1,1), @myDateTime) DDD
, DatePart(Hour, @myDateTime)  HH
, DatePart(Minute, @myDateTime) MM

--to format as a single string

select right('0' + cast(DatePart(YEAR, @myDateTime) - 2000 as varchar(10)), 2)
+ right('00' + cast(DateDiff(Day, DateFromParts(DatePart(YEAR, @myDateTime),1,1), @myDateTime) as varchar(10)), 3)
+ '-'
+ right('0' + cast(DatePart(Hour, @myDateTime) as varchar(10)), 2)  
+ right('0' + cast(DatePart(Minute, @myDateTime) as varchar(10)), 2) 
  • DatePart(YEAR, @myDateTime) - 2000 дает нам двухзначный год, получая полный год (например, 2018 как число, а затем отбрасывая только те цифры, которые нам интересны, вычитая 2000)
  • DateDiff(Day, DateFromParts(DatePart(YEAR, @myDateTime),1,1), @myDateTime) дает нам количество дней с 1 января в году даты даты (задается DateFromParts(DatePart(YEAR, @myDateTime),1,1)) до указанной даты (поэтому 1 января будет 0; если вы хотите, чтобы 1 январябыть 1, просто добавьте 1 к этому результату.)
  • Значение часа и минуты просто задается путем вытягивания этих частей даты.
  • Когда мы создаем строку, мы приводим эти числовые результаты кСтроки (varchar) и объединить их.
  • Часть right('0' + /*...*/) позволяет нам правильно дополнить цифры начальными нулями, поэтому если время равно 09:05, мы получим 0905 вместо 95.

Вы можете получить почти то, что вам нужно, с помощью встроенной команды format, например,

select format(@myDateTime, 'yy-HHmm')

Однако часть ddd недоступна, так как ddd преобразуется в название дня недели, т. Е. Согласно документации .Тем не менее, вы можете использовать это для упрощения выше: Пример

select format(@myDateTime, 'yy') 
+ right('00' + cast(DateDiff(Day, DateFromParts(DatePart(YEAR, @myDateTime),1,1), @myDateTime) as varchar(10)), 3)
+ format(@myDateTime, '-HHmm') 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...