Sql server 从周和年获取日期-日期必须是一年中的第一天-sql
我有一个将周和年转换为日期的查询。 但它会返回确切的日期 但我想要的是,我需要的日期是这样的一天,即与一年中的第一天相同Sql server 从周和年获取日期-日期必须是一年中的第一天-sql,sql-server,date,Sql Server,Date,我有一个将周和年转换为日期的查询。 但它会返回确切的日期 但我想要的是,我需要的日期是这样的一天,即与一年中的第一天相同 dateadd (week, PromisedWeek-1, dateadd (year, PromisedYear-1900, 0)) - 4 - datepart(dw, dateadd (week, PromisedWeek-1, dateadd (year, PromisedYear-1900, 0)) - 4) + 1 假设的例子。 我当前的查询是: 如果周数为
dateadd (week, PromisedWeek-1, dateadd (year, PromisedYear-1900, 0)) - 4 -
datepart(dw, dateadd (week, PromisedWeek-1, dateadd (year, PromisedYear-1900, 0)) - 4) + 1
假设的例子。
我当前的查询是:
如果周数为4,年份为2017,则返回2017年12月26日
我的需要:
如果第4周为2017年,1月1日为星期三,则应返回2017年第29个星期三
希望你们能明白我想解释的
我需要查询返回这样一个日期,该日期与今年的第一天的日期相同。除非我读错了,否则你是在给自己制造麻烦。只要这样做:
declare @year int; set @year = 2017;
declare @week int; set @week = 4;
select dateadd(week, @week, dateadd(year, @year - 1900, 0))
结果:
2017-01-29 00:00:00.000
2017-01-29 00:00:00.000
内部的dateadd()
为您提供所请求年份的第一天(1月1日),与工作日无关。如果是星期三,你会得到一个星期三。今年是星期天。然后,外部的dateadd()
会将整周添加到该日期中,这样您就可以得到一周中的同一天,就像您要求的那样
如果这不是您想要的,请解释它需要如何变得更复杂。如果您有一个日历表,这很容易。日历表是包含给定范围内的每个日期及其部分的表。我用以下代码创建了2010年至2020年的矿井:
declare @start_dt as date = '1/1/2010';
declare @end_dt as date = '1/1/2020';
declare @dates as table (
date_id date primary key,
date_year smallint,
date_month tinyint,
date_day tinyint,
weekday_id tinyint,
weekday_nm varchar(10),
month_nm varchar(10),
day_of_year smallint,
quarter_id tinyint,
first_day_of_month date,
last_day_of_month date,
start_dts datetime,
end_dts datetime
)
while @start_dt < @end_dt
begin
insert into @dates(
date_id, date_year, date_month, date_day,
weekday_id, weekday_nm, month_nm, day_of_year, quarter_id,
first_day_of_month, last_day_of_month,
start_dts, end_dts
)
values(
@start_dt, year(@start_dt), month(@start_dt), day(@start_dt),
datepart(weekday, @start_dt), datename(weekday, @start_dt), datename(month, @start_dt), datepart(dayofyear, @start_dt), datepart(quarter, @start_dt),
dateadd(day,-(day(@start_dt)-1),@start_dt), dateadd(day,-(day(dateadd(month,1,@start_dt))),dateadd(month,1,@start_dt)),
cast(@start_dt as datetime), dateadd(second,-1,cast(dateadd(day, 1, @start_dt) as datetime))
)
set @start_dt = dateadd(day, 1, @start_dt)
end
select *
into Calendar
from @dates
事实证明,2017年1月1日是星期日,2017年第4个星期日是1月22日,因此返回值为2017年22日<代码>能否共享表格结构和一些样本数据以及样本数据的所需输出?兄弟,我不知道是谁给了你负面回购,但这是我需要的解决方案。明亮的谢谢
declare @PromisedYear as numeric
declare @PromisedWeek as int
set @PromisedYear = 2017
set @PromisedWeek = 4
select concat(date_day, '-', weekday_nm, '-', @PromisedYear)
from Calendar as c
where
weekday_id =
(select weekday_ID
from Calendar
where date_year = @PromisedYear
and day_of_year = 1
)
and datepart(week, date_id) = @PromisedWeek
and date_year = @PromisedYear