在变量中设置日期格式
Posted
技术标签:
【中文标题】在变量中设置日期格式【英文标题】:Set Date Format in Variable 【发布时间】:2017-03-09 21:34:39 【问题描述】:只是想知道是否有人可以帮助我为报告设置一个日期变量,以便在每年的特定日期之间运行,而无需手动更新。
例如,我在下面硬编码了日期,但我想知道我是否可以设置一个日期格式,让它进入 2017 年,以便 2017 年的日期发生变化。我想有一种方法可以设置年度日期格式,但我不确定如何。
这是我设置的硬编码变量。 输入错误的日期范围更改如下。
set @start_date = '2016-01-02';
set @end_date = '2017-01-01';
下面是我的 where 子句中的内容。
and create_date between @start_date and @end_date
【问题讨论】:
避免对日期范围使用between
,请参阅sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/… 或experts-exchange.com/articles/11210/Beware-of-Between.html
【参考方案1】:
给你。
declare @s datetime, @e datetime
set @s=cast(cast(year(getdate()) as char(4))+'-01-02' as date)
set @e=cast(cast(year(getdate()) as char(4))+'-12-31' as date)
select @s,@e
【讨论】:
【参考方案2】:我假设您想要基于“今天”的完整“当前年份”
select *
from whatever
where ( create_date >= CONCAT(YEAR(CURDATE()),'-01-01')
and create_date < CONCAT(YEAR(CURDATE())+1,'-01-01')
)
测试它:
SELECT
CONCAT(YEAR(CURDATE()),'-01-01') This_year_start
, CONCAT(YEAR(CURDATE())+1,'-01-01') Next_year_start
SQL 服务器 (tsql)
select *
from whatever
where ( create_date >= DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0)
and create_date < DATEADD(YEAR, DATEDIFF(YEAR, -1, GETDATE()), 0)
)
测试它:
select
DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()) , 0) This_year_start
, DATEADD(YEAR, DATEDIFF(YEAR, -1, GETDATE()), 0) Next_year_start
This_year_start Next_year_start
01.01.2016 00:00:00 01.01.2017 00:00:00
DATEDIFF(YEAR, 0, GETDATE()) 从
基准年
将该年数添加到基准日期 (1900-01-01)
DATEDIFF(YEAR, -1, GETDATE()) 计算从
基准年的前一年(比上面的数字大 1)
将该年数添加到基准日期 (1900-01-01)
请避免在日期范围内使用between
。使用 >= 和 的组合要安全得多
例如 其中 create_date >= '2016-01-01' 和 create_date
使用这种方法,无论对 [create_date] 中的数据应用什么时间精度,您都将获得所需信息的精确范围。
【讨论】:
【参考方案3】:设置@start_date = CAST(CAST(YEAR(getdate()) AS nvarchar(4)) + '0102' AS DATETIME);
获取当年年末
SET @end_date = DATEADD(day, -1 , DATEADD(month,13 - MONTH(getdate()), DATEADD(day,1 - DAY(getdate()),getdate())));
【讨论】:
【参考方案4】:您的范围涵盖一年中的所有日子,1 月 1 日除外。所以你可以简单地检查日期和月份:
WHERE NOT (DAY(create_date) = 1 AND MONTH(create_date) = 1)
【讨论】:
以上是关于在变量中设置日期格式的主要内容,如果未能解决你的问题,请参考以下文章