在SQL Server中从日期检索年和周号

时间:2019-01-18 05:37:53

标签: sql sql-server sql-date-functions

我正在尝试以yyyyww201901201905等格式获取201911的年号和周号,而我正在使用此查询来执行此操作:

declare @BeginDate datetime

set @beginDate = '2019-02-07'

select  
     concat(datepart(year, @BeginDate), right('0' + convert(varchar, datepart(week, dateadd(day, -7 , @BeginDate))), 2)) 

在2018年12月之前运行良好。但是,当我在日期2019-01-07上尝试此操作时,它返回了201953,这是不正确的。但是对于所有其他值(例如2019-01-14等),它可以正确获取星期数。

那我怎样才能全年准确获取年周数组合

4 个答案:

答案 0 :(得分:2)

您可以尝试使用以下代码

SELECT concat(year('2019-01-07'),Format(datepart(day, datediff(day, 0, '2019-01-07')/7 * 7)/7 + 1 , '00') )

输出

201902

SELECT concat(year('2019-01-01'),Format(DATEPART( wk, '2019-01-01')  , '00') )

输出

201901

答案 1 :(得分:1)

您没有考虑“年周”的定义:

根据Wikipedia: 第一年的一周是包含一年中第一个星期四的一周,或者是包含1月4日的一周,或者是从12月29日至1月4日开始的一周。

因此,如果年份以第52或53周开始,那是前一年的最后一周的末尾。

所以你有

EditText text = (EditText) findViewById(R.id.taskviewer_date);
text.setOnClickListener(
    new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("taskviewer", "OnClickListener called !");
        }
    }
);

其结果是set dateformat ymd set datefirst 1 declare @data as datetime declare @year as int set @data = cast('2017-01-01' as datetime) set @year = case when datepart(iso_week,@data) >= 52 and month(@data) = 1 then year(@data)-1 when datepart(iso_week,@data) = 1 and month(@data) = 12 then year(@data)+1 else year(@data) end select concat (@year, right('0'+cast(datepart(iso_week,@data) as varchar(6)),2))

编辑:已更新为始终具有两位数的星期

答案 2 :(得分:0)

下面的代码块不是确切的解决方案,但是绝对可以帮助您。

SQL

DECLARE @Dt datetime

SELECT @Dt='02-21-2008'

SELECT DATEPART( wk, @Dt)

答案 3 :(得分:0)

通常,使用标准函数来计算日期的标准部分的更清晰方法。 因此,我建议将DATEPART与RIGHT结合使用,以确保我们从右边开始有两个字符:

DECLARE @DT AS DATE = '2019-01-07'
SELECT  CONCAT(year(@DT),
        RIGHT('0'+CONVERT(VARCHAR(2), DATEPART(wk, @DT)), 2))