铸造给我错误的日期?
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
我在做什么错?
非常感谢!
你为什么试图一口气做完所有事情,并在整个地方重复自己。
如果你开始
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
我想这是你所追求的,并通过沼泽地跋涉之后我甚至有可能得到它。
谢谢托尼,但我不得不使用的第三方软件的局限性之一是它有要一次性完成(而且工作表也不允许!)我知道的垃圾,但我只能用我得到的工具来工作:-(我怀疑我试图实现不可能的事情。 – 2012-07-07 14:30:24
我认为问题是,你已经提取使用CASE
表达式月份和年份的组件 - 并通过这些表达式的YEAR
和MONTH
功能的结果 - 它希望传递一个datetime
值。因此,您将导致将int
s隐式转换回datetime
值。
SELECT YEAR(2012)
----
1905
SELECT MONTH(12)
----
01
当int
被隐式转换为datetime
,它有效的,因为19000101
天数。大多数日子〜2000天以后19000101
发生在1905年
所有这一切是说,这一切看起来很多复杂得多,它需要 - 使用子查询,你可以进行一次相应的计算,而不是重复它们 - 初始输入是什么,以及你想要达到的最终输出是什么?
感谢你的这一点,我想我将不得不重新编写代码 – 2012-07-07 13:50:53
这必须在一个查询中完成,因为我使用的SQL第三方功能有限。我有一个两列(购买日期,到期日期)和六个样本记录的简单测试表.....我试图将发布月份(我的输出的第三和第四列)放到YYYYMM的第五列格式。 – 2012-07-07 13:59:35
@RastaPickles,只是为你做了我认为,不要以为我现在会得到报酬:) – 2012-07-07 14:08:46
这伤害了我的大脑。请构建一个更简单的测试用例! – 2012-07-07 13:33:37
我猜对了SQL Server。如果这是错误的,请适当修改您的标签。你已经展示了一些输出结果,但是你不知道你想要达到什么目标(你没有告诉我们)。另外,你正在处理的列的数据类型是什么?告诉我们*什么是错的。 – 2012-07-07 13:35:03
对不起,第五列给了我每个记录相同的输出,我不知道为什么? – 2012-07-07 13:40:12