铸造给我错误的日期?

问题描述:

SELECT DATEPART(YEAR, PURCHASE_DATE) AS TRANSACTION_YEAR, DATEPART(MONTH, PURCHASE_DATE) AS TRANSACTION_MONTH, 
CASE WHEN DATEPART(YEAR, DUE_DATE) >= DATEPART(YEAR, PURCHASE_DATE) THEN DATEPART(YEAR, DUE_DATE) 
ELSE DATEPART(YEAR, PURCHASE_DATE) END AS RELEASE_YEAR, 
CASE WHEN (DATEPART(YEAR, DUE_DATE) = DATEPART(YEAR, PURCHASE_DATE) AND DATEPART(MONTH, DUE_DATE) >= DATEPART(MONTH, PURCHASE_DATE)) THEN DATEPART(MONTH, DUE_DATE) 
WHEN DATEPART(YEAR, DUE_DATE) > DATEPART(YEAR, PURCHASE_DATE) THEN DATEPART(MONTH, DUE_DATE) 
ELSE 
DATEPART(MONTH, PURCHASE_DATE) END AS RELEASE_MONTH, 
CAST(YEAR(CASE WHEN DATEPART(YEAR, DUE_DATE) >= DATEPART(YEAR, PURCHASE_DATE) THEN DATEPART(YEAR, DUE_DATE) 
ELSE DATEPART(YEAR, PURCHASE_DATE) END) AS VARCHAR(4)) + RIGHT('0'+CAST(MONTH(CASE WHEN (DATEPART(YEAR, DUE_DATE) = DATEPART(YEAR, PURCHASE_DATE) AND DATEPART(MONTH, DUE_DATE) >= DATEPART(MONTH, PURCHASE_DATE)) THEN DATEPART(MONTH, DUE_DATE) 
WHEN DATEPART(YEAR, DUE_DATE) > DATEPART(YEAR, PURCHASE_DATE) THEN DATEPART(MONTH, DUE_DATE) 
ELSE 
DATEPART(MONTH, PURCHASE_DATE) END) AS VARCHAR(2)),2) 
FROM TEST 

上的六个记录样本表产生铸造给我错误的日期?

2012 1 2012 1 190501 
2012 1 2013 12 190501 
2011 1 2012 1 190501 
2011 1 2011 1 190501 
2012 1 2012 1 190501 
2012 1 2012 2 190501 

我在做什么错?

非常感谢!

+2

这伤害了我的大脑。请构建一个更简单的测试用例! – 2012-07-07 13:33:37

+1

我猜对了SQL Server。如果这是错误的,请适当修改您的标签。你已经展示了一些输出结果,但是你不知道你想要达到什么目标(你没有告诉我们)。另外,你正在处理的列的数据类型是什么?告诉我们*什么是错的。 – 2012-07-07 13:35:03

+0

对不起,第五列给了我每个记录相同的输出,我不知道为什么? – 2012-07-07 13:40:12

你为什么试图一口气做完所有事情,并在整个地方重复自己。

如果你开始

select 
DatePart(YEAR,PURCHASE_DATE) as PURCHASE_YEAR, 
DatePart(YEAR,DUE_DATE) as DUE_YEAR, 
DatePart(MONTH,PURCHASE_DATE) as PURCHASE_MONTH, 
DatePart(MONTH,DUE_DATE) as DUE_MONTH 
From Test 

然后,你可以做

SELECT PURCHASE_Year AS TRANSACTION_YEAR, 
     PURCHASE_Month) AS TRANSACTION_MONTH, 
     CASE 
     WHEN DUE_YEAR >= PURCHASE_YEAR THEN DUE_YEAR 
     ELSE PURCHASE_YEAR 
     END AS RELEASE_YEAR, 
     CASE 
     WHEN (DUE_YEAR = PURCHASE_YEAR) AND (DUE_MONTH >= PURCHASE_MONTH) THEN DUE_MONTH 
     WHEN DUE_YEAR > PURCHASE_YEAR THEN DUE_MONTH 
     ELSE PURCHASE_MONTH 
     END AS RELEASE_MONTH, 
     CAST(
     CAST(RELEASE_YEAR As VarChar(4)) + 
     '-' + 
     CAST(RELEASE_MONTH as VarChar(2)) + 
     '-1' as DATE) as RELEASE_DATE 
FROM (
select 
DatePart(YEAR,PURCHASE_DATE) as PURCHASE_YEAR, 
DatePart(YEAR,DUE_DATE) as DUE_YEAR, 
DatePart(MONTH,PURCHASE_DATE) as PURCHASE_MONTH, 
DatePart(MONTH,DUE_DATE) as DUE_MONTH 
From Test 
) SomeDummyTableName 

我想这是你所追求的,并通过沼泽地跋涉之后我甚至有可能得到它。

+0

谢谢托尼,但我不得不使用的第三方软件的局限性之一是它有要一次性完成(而且工作表也不允许!)我知道的垃圾,但我只能用我得到的工具来工作:-(我怀疑我试图实现不可能的事情。 – 2012-07-07 14:30:24

我认为问题是,你已经提取使用CASE表达式月份和年份的组件 - 并通过这些表达式的YEARMONTH功能的结果 - 它希望传递一个datetime值。因此,您将导致将int s隐式转换回datetime值。

SELECT YEAR(2012) 

---- 
1905 

SELECT MONTH(12) 

---- 
01 

int被隐式转换为datetime,它有效的,因为19000101天数。大多数日子〜2000天以后19000101发生在1905年


所有这一切是说,这一切看起来很多复杂得多,它需要 - 使用子查询,你可以进行一次相应的计算,而不是重复它们 - 初始输入是什么,以及你想要达到的最终输出是什么?

+0

感谢你的这一点,我想我将不得不重新编写代码 – 2012-07-07 13:50:53

+0

这必须在一个查询中完成,因为我使用的SQL第三方功能有限。我有一个两列(购买日期,到期日期)和六个样本记录的简单测试表.....我试图将发布月份(我的输出的第三和第四列)放到YYYYMM的第五列格式。 – 2012-07-07 13:59:35

+0

@RastaPickles,只是为你做了我认为,不要以为我现在会得到报酬:) – 2012-07-07 14:08:46