我正在尝试以yyyyww
,201901
,201905
等格式获取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等),它可以正确获取星期数。
那我怎样才能全年准确获取年周数组合
答案 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)
下面的代码块不是确切的解决方案,但是绝对可以帮助您。
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))