【问题标题】:Get date from week and year - date must be first day of the year - sql从周和年获取日期 - 日期必须是一年中的第一天 - sql
【发布时间】:2017-10-13 01:28:17
【问题描述】:

我有一个查询可以将星期和年份转换为日期。 但它会返回确切的日期。

但我想要的是,我需要日期是这样的一天,与一年中的第一天相同。

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 年,则返回 26-Sun-2017

我的需求: 如果第 4 周和 2017 年且 1 月 1 日是星期三,则应返回 29-Wednesday-2017。

希望你们明白我要解释的内容。

我需要查询返回与当年第一天相同的日期。

【问题讨论】:

  • 你能分享表结构和一些示例数据以及示例数据的所需输出吗?目前尚不清楚您要在这里做什么。

标签: sql-server date


【解决方案1】:

除非我读错了,否则你对自己太苛刻了。只需这样做:

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

内部dateadd() 为您提供所请求年份的第一天(1 月 1 日),与工作日无关。如果是星期三,你会得到一个星期三。今年是星期天。外部的dateadd() 然后加上整周,所以你最终得到了一周中的同一天,就像你问的那样。

如果这不是你想要的,请解释它需要如何变得更复杂。

【讨论】:

  • 兄弟,我不知道谁给了你负面回购,但这是我需要的解决方案。杰出的!谢谢
【解决方案2】:

如果你有一个日历表,这很容易。日历表是包含给定范围的每个日期及其部分的表。我用这段代码为 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

一旦有了日历表,您就可以在PromisedWeek 中查询正确的工作日

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

原来2017年1月1日是星期日,2017年的第4个星期日是1月22日,所以返回是22-Sunday-2017

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多