2017-02-20 75 views
0

我有一个选择开始和结束日期的SQL。我需要创建输出,以DayName,MonthName dd,yyyy格式显示该范围的所有日期,这里是大写的扭曲...。SQL将日期延长并转换为格式2017年2月20日星期一OR Excel函数

我一直在寻找,但我发现的所有答案,我相信是过于繁琐。

或... 有没有办法在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 

编辑: 对于vknowles 这是另一种方式,你可以得到相同的结果,而不使用在CTE的交叉连接。

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

耶!这样可行!谢谢乔纳森。 :) – shykitten

+0

@jonathan - 我想我解析了这个并理解它是如何工作的,但我有一个问题。我不确定是否应该打开一个新问题,但是这里是:我假设您将all_objects与其自身的交叉连接仅用于创建一个大行空间,然后您可以使用它创建尽可能多的日期条目。如果你有一个小的数据库和一个很大的日期范围,那么这个交叉连接不会产生足够的行? (我意识到这是不可能的。) – vknowles

+0

我承认我没有考虑过。我会编辑我的答案,以包含另一种方式。 – Jonathan