SQL Server数据库 怎样求解给定任意日期的当季首日
2016-07-07 11:30
441 查看
--错误版
declare @TrailingDate Date;
set @TrailingDate='20161207';
select
case when month(@TrailingDate) <= 3 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-01-01')
when month(@TrailingDate)%3 = 0 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), month(@TrailingDate)-3) + '-01')
else convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), (month(@TrailingDate)-month(@TrailingDate)%3+1)) + '-01') end
as CurrentQuarter
--改正版
--原版SQL中convert(varchar(2), month(@TrailingDate)-3)中会导致逢6,9,12月份的季度首日提前至3,6,9月,正解为4,7,10月
select
case when month(@TrailingDate) <= 3 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-01-01')
when month(@TrailingDate)%3 = 0 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), month(@TrailingDate)-2) + '-01')
else convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), (month(@TrailingDate)-month(@TrailingDate)%3+1)) + '-01') end
as CurrentQuarter
--改进版
select convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), 3*((month(@TrailingDate)-1)/3)+1) + '-01') as CurrentQuarter
-- 3*((month(@TrailingDate)-1)/3)+1)在数学计算上等于month(@TrailingDate),但它们真的相等吗?
--最优解版
select DATEADD(qq,DATEDIFF(qq,0,@TrailingDate), 0) as CurrentQuarter
declare @TrailingDate Date;
set @TrailingDate='20161207';
select
case when month(@TrailingDate) <= 3 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-01-01')
when month(@TrailingDate)%3 = 0 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), month(@TrailingDate)-3) + '-01')
else convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), (month(@TrailingDate)-month(@TrailingDate)%3+1)) + '-01') end
as CurrentQuarter
--改正版
--原版SQL中convert(varchar(2), month(@TrailingDate)-3)中会导致逢6,9,12月份的季度首日提前至3,6,9月,正解为4,7,10月
select
case when month(@TrailingDate) <= 3 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-01-01')
when month(@TrailingDate)%3 = 0 then convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), month(@TrailingDate)-2) + '-01')
else convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), (month(@TrailingDate)-month(@TrailingDate)%3+1)) + '-01') end
as CurrentQuarter
--改进版
select convert(date, convert(varchar(4), year(@TrailingDate)) + '-' + convert(varchar(2), 3*((month(@TrailingDate)-1)/3)+1) + '-01') as CurrentQuarter
-- 3*((month(@TrailingDate)-1)/3)+1)在数学计算上等于month(@TrailingDate),但它们真的相等吗?
--最优解版
select DATEADD(qq,DATEDIFF(qq,0,@TrailingDate), 0) as CurrentQuarter
相关文章推荐
- redis持久化的配置
- SQL之经典SQL语句大全
- Redis持久化(persistence)介绍
- Sql Server合并多行询数据到一行:使用自连接、FOR XML PATH('')、STUFF或REPLACE函数
- MongoDB 命令笔记
- Redis学习笔记(九)redis 配置文件详解
- 数据库设计三大范式
- mysql获取成绩排名
- mysql sql 百万级数据库优化方案
- 免费的实时数据库,我们该选谁?----BerkeleyDB与SQLite评测对比
- 安装SQl 2008为SQL Server代理服务提供的凭据无效
- mysql索引优化
- sql 在将 nvarchar 值 转换成数据类型 int 时失败。
- psql中的\x命令
- Redis - HyperLogLogs
- Sqoop导入关系数据库到Hive
- 如何将mysql数据库的表导出到本地csv格式
- Redis学习三:redis的sentinel使用
- 关于mysql 删除数据后物理空间未释放(转载)
- java redis demo关于List<Integer>,List<String>