Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Дату в строку по заданному правилу/формату.  [new]
OYMaxim
Member

Откуда:
Сообщений: 3
Здравствуйте товарищи!

Такая проблема, не вижу "красивого" решения. Может кто подскажет.

MS SQL 2005
Надо переменную типа DateTime привести к строке по определённому правилу/формату 'ddmmyyyy_hhmm'
dd - день
mm - месяц
yyyy - год
hh - часы
mm - минуты

Поиском нашел это и это

Но это не решает задачу (или я плохо штудировал), подходящих форматов так и не нашел.

DatePart вроде бы подходит, но она возвращает INT и ведущий ноль "съедается".
Например:

DECLARE @dt DATETIME
SET @dt = CONVERT(DATETIME,'09.05.2012 08:09',104)

SELECT
CONVERT(VARCHAR,DATEPART(dd,@dt)) +
CONVERT(VARCHAR,DATEPART(mm,@dt)) +
CONVERT(VARCHAR,DATEPART(yyyy,@dt)) +
'_' +
CONVERT(VARCHAR,DATEPART(hh,@dt)) +
CONVERT(VARCHAR,DATEPART(mi,@dt))


результат:
952012_89

а по условию задачи требуется:
09052012_0809

Понятно, что напрашивается анализ возвращаемого значения функцией DATEPART() и добавления ведущего нолика.
Например CASE`ами.

DECLARE @dt DATETIME
SET @dt = CONVERT(DATETIME,'09.05.2012 08:09',104)

SELECT
CASE WHEN DATEPART(dd,@dt) > 10 THEN CONVERT(VARCHAR,DATEPART(dd,@dt)) ELSE '0'+CONVERT(VARCHAR,DATEPART(dd,@dt)) END +
CASE WHEN DATEPART(mm,@dt) > 10 THEN CONVERT(VARCHAR,DATEPART(mm,@dt)) ELSE '0'+CONVERT(VARCHAR,DATEPART(mm,@dt)) END +
CONVERT(VARCHAR,DATEPART(yyyy,@dt)) +
'_' +
CASE WHEN DATEPART(hh,@dt) > 10 THEN CONVERT(VARCHAR,DATEPART(hh,@dt)) ELSE '0'+CONVERT(VARCHAR,DATEPART(hh,@dt)) END +
CASE WHEN DATEPART(mi,@dt) > 10 THEN CONVERT(VARCHAR,DATEPART(mi,@dt)) ELSE '0'+CONVERT(VARCHAR,DATEPART(mi,@dt)) END


Но это уже страшно выглядит, я почему-то не верю в такое решение.
Как поётся в одной песне.

...
Я не умею петь о любви
Я не умею петь о цветах
А если я пою значит вру
Я сам не верю что это так
...

Мне кажется, можно как то элегантнее решить задачу.
11 май 12, 21:38    [12539250]     Ответить | Цитировать Сообщить модератору
 Re: Дату в строку по заданному правилу/формату.  [new]
OYMaxim
Member

Откуда:
Сообщений: 3
ошибся со знаками, не просто > а >=
но не суть...
11 май 12, 21:48    [12539285]     Ответить | Цитировать Сообщить модератору
 Re: Дату в строку по заданному правилу/формату.  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
OYMaxim,


DECLARE @d1 datetime;
set @d1 = '2012-04-05 12:43:00'
select RIGHT('0'+convert(varchar(2),datepart(DAY, @d1)),2) +
       RIGHT('0'+convert(varchar(2),datepart(MONTH, @d1)),2) +
      cast(datepart(year,@d1) as varchar(4))


с hh mm по аналогии
11 май 12, 21:56    [12539315]     Ответить | Цитировать Сообщить модератору
 Re: Дату в строку по заданному правилу/формату.  [new]
OYMaxim
Member

Откуда:
Сообщений: 3
is_me,
Да, хитро и красивше! Спасибо!
11 май 12, 22:06    [12539349]     Ответить | Цитировать Сообщить модератору
 Re: Дату в строку по заданному правилу/формату.  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
DECLARE @d1 datetime;
set @d1 = '2012-04-05 12:43:00';

SELECT REPLACE(CONVERT(VARCHAR(10),@d1,104),'.','')+'_'+REPLACE(CONVERT(VARCHAR(5),@d1,8),':','');
11 май 12, 22:21    [12539394]     Ответить | Цитировать Сообщить модератору
 Re: Дату в строку по заданному правилу/формату.  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
iap
DECLARE @d1 datetime;
set @d1 = '2012-04-05 12:43:00';

SELECT REPLACE(CONVERT(VARCHAR(10),@d1,104),'.','')+'_'+REPLACE(CONVERT(VARCHAR(5),@d1,8),':','');


Прикольно, очень удобно.
Но с оговоркой на dateformat, можно получить разные результаты
SET DATEFORMAT dmy
или
SET DATEFORMAT mdy
или ...
12 май 12, 08:53    [12540176]     Ответить | Цитировать Сообщить модератору
 Re: Дату в строку по заданному правилу/формату.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Но с оговоркой на dateformat, можно получить разные результаты

да ну? а у меня одинаковые.
DECLARE @d1 datetime;
set @d1 = '2012-04-05 12:43:00';

SET DATEFORMAT dmy
SELECT REPLACE(CONVERT(VARCHAR(10),@d1,104),'.','')+'_'+REPLACE(CONVERT(VARCHAR(5),@d1,8),':','');
SET DATEFORMAT mdy
SELECT REPLACE(CONVERT(VARCHAR(10),@d1,104),'.','')+'_'+REPLACE(CONVERT(VARCHAR(5),@d1,8),':','');


это строка '2012-04-05 12:43:00' к datetime по-разному преобразуется
в зависимости от dateformat. но здесь она только для примера - к решению
это никакого отношения не имеет.

Posted via ActualForum NNTP Server 1.5

12 май 12, 09:04    [12540209]     Ответить | Цитировать Сообщить модератору
 Re: Дату в строку по заданному правилу/формату.  [new]
clemence
Guest
is_me, вот скрипт проще:
SELECT convert(VARCHAR(8),getdate(),112)+replace(convert(VARCHAR(6),getdate(),108),':','')
7 сен 12, 14:08    [13129934]     Ответить | Цитировать Сообщить модератору
 Re: Дату в строку по заданному правилу/формату.  [new]
да прям
Guest
да прям
SELECT convert(VARCHAR(8),getdate(),112) отдаст yyyymmdd, а ТС просил ddmmyyyy
7 сен 12, 14:14    [13129993]     Ответить | Цитировать Сообщить модератору
 Re: Дату в строку по заданному правилу/формату.  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
clemence
is_me, вот скрипт проще:
SELECT convert(VARCHAR(8),getdate(),112)+replace(convert(VARCHAR(6),getdate(),108),':','')
А что, в 112-м формате сначала день идёт, а потом месяц и год?
Вот это новость!
7 сен 12, 14:15    [13130010]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить