2017-02-20 1 views
0

У меня есть SQL, который выбирает дату начала и окончания. Мне нужно создать вывод, который отображает все даты этого диапазона в формате DayName, MonthName dd, yyyy и вот твист ... в UPPERCASE.SQL для продления дат и конвертирования в формат Понедельник, 20 февраля 2017 г. ИЛИ функция Excel

Я искал, но все ответы, которые я нахожу, я считаю чрезмерно громоздкими.

OR ... Есть ли способ в Excel форматировать формат в верхнем регистре? Как только я отформатирую поле даты в DayName, MonthName dd, yyyy, это не позволяет мне выполнить функцию = UPPER(). Я бы предпочел все это сделать с SQL.

Заранее спасибо.

+0

Я не думаю, что есть способ в Excel, чтобы сделать форматированный дату в верхнем регистре, но вы можете использовать формулу, чтобы превратить дату в текстовое значение, а затем сделать его прописными буквами, как в '= UPPER (TEXT (NOW(), "dddd, mmmm dd, yyyy")) '- просто замените« NOW() »на дату или ссылку на ячейку, которая содержит дату. – vknowles

ответ

1

Я считаю, что я был в состоянии сделать то, что вы просили с этим

DECLARE @MinDate DATE = '20120101', 
     @MaxDate DATE = '20140101'; 
with cte (testDate) 
as(
SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1) 
     Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate) 
FROM sys.all_objects a 
     CROSS JOIN sys.all_objects b 
) 

select 
UPPER(CAST(DATENAME(dw, testDate)as varchar(10)) + ', ' + 
     CAST(DATENAME(MM, testDate) as varchar(10)) 
     + ' ' + CAST(DAY(testDate) as varchar(2)) 
     + ', ' + CAST(YEAR(testDate) as varchar(4))) as test 
     FROM cte 

EDIT: Для vknowles Это еще один способ, которым вы могли бы получить те же результаты без использования перекрестного соединения в КТР.

DECLARE @MinDate DATE = '20120101', 
     @MaxDate DATE = '20140101'; 

WITH cte (testDate) AS 
(
    SELECT CAST(@MinDate as DATETIME) as testDate 
    UNION ALL 
    SELECT testDate + 1 
    FROM cte 
    WHERE testDate + 1 <= @MaxDate 
) 

select 
UPPER(CAST(DATENAME(dw, testDate)as varchar(10)) + ', ' + 
     CAST(DATENAME(MM, testDate) as varchar(10)) 
     + ' ' + CAST(DAY(testDate) as varchar(2)) 
     + ', ' + CAST(YEAR(testDate) as varchar(4))) as test 
     FROM cte 
OPTION (MAXRECURSION 0) 
+0

Yay! Это работает! Спасибо, Джонатан. :) – shykitten

+0

@jonathan - Я думаю, что разобрал это и понял, как это работает, но у меня есть вопрос. Не уверен, должен ли я открыть новый вопрос, но вот он: Я предполагаю, что ваше крестное объединение all_objects для себя предназначено исключительно для создания большого пространства строк, которое вы затем используете для создания столько записей даты, сколько вам нужно. Что делать, если у вас небольшая база данных и большой диапазон дат, поэтому это перекрестное соединение не создает достаточное количество строк? (Я понимаю, это маловероятно.) – vknowles

+0

Я признаю, что не думал об этом. Я отредактирую свой ответ, чтобы включить другой способ. – Jonathan

Смежные вопросы