【发布时间】:2013-01-05 12:04:48
【问题描述】:
下面是我表中的示例记录。
字段是 varchar, ToDate 包含两个空记录。 (不是数据库 NULL)
CustomerID FromDate ToDate
1 20120810 20120920
2 20120901 20120915
3 20120112
4 20120815
5 20120817 20120920
6 20120817 20120920
必须遵守以下规则:
- 按 ToDate 列中最远的日期排序。
- 当记录为空时,取当前日期+30 而不是空,
- 如果 ToDate 中的两个日期相同,则取 FromDate 中最远的日期。
所以对于上述记录样本,我需要输出为
CustomerID FromDate ToDate
3 20120112 20130221
因为客户 id 4 和 5 ToDate 是空的,所以我们考虑应该从 getdate() 函数中添加 30 天。所以 Todate 是相等的,所以我现在想按 FromDate 排序。
日期的输入是 20120810
select top 1 customer_id,
max(convert(datetime,Fromdate,101)) as Fromdate,
convert(datetime,(CASE WHEN Todate = '' THEN getdate() + 30 WHEN Todate != '' THEN Todate END),101) as Todate,
customer_id
FROM dbo.sample_tbl (nolock)
WHERE customer_id = '1'
AND Fromdate <= '20120810'
AND (CASE WHEN ToDate = '' THEN getdate() + 30 WHEN ToDate != '' THEN ToDate END) >= '20120810'
group by convert(datetime,(CASE WHEN ToDate = '' THEN getdate() + 30 WHEN ToDate != '' THEN ToDate END),101),customer_id
order by convert(datetime,(CASE WHEN ToDate = '' THEN getdate() + 30 WHEN ToDate != '' THEN ToDate END),101) desc
当前输出为
CustomerID FromDate ToDate
3 20120112 20130221
预计是
CustomerID FromDate ToDate
3 20120815 20130221
【问题讨论】:
-
为什么将日期时间存储为 varchar?
-
我一定很密集。你能强调一下“当前”和“预期”之间的区别吗?
-
@Damien_The_Unbeliever 我刚刚更新,你现在可以检查一下吗。
-
您说“客户 ID 4 和 5 ToDate 为空”,但这不是您的示例数据所说的;这意味着我不太愿意尝试弄清楚您的要求到底是什么。
-
我只是使用了todate desc,fromdate desc的顺序。并将getdate转换为varchar。现在问题已解决。
标签: sql sql-server