sql-server - 获取 12 月 31 日的正确周数
问题描述
在 SQL Server 中,我试图获取给定日期的周数(带有年份),欧洲风格,所以我使用DATEPART
withISO_WEEK
参数:
SELECT CAST(DATEPART(year, myDate) AS VARCHAR) + RIGHT('0' + CAST(DATEPART(ISO_WEEK, myDate) AS VARCHAR), 2);
这很好用,除了 2018 年 12 月 31 日,它是 2019 年的第一周,但由于我DATEPART
分别使用一年和一周,这显然行不通。以下是 myDate 为 31-12-2018 的示例:
SELECT CAST(DATEPART(year, '31-12-2018') AS VARCHAR) + RIGHT('0' + CAST(DATEPART(ISO_WEEK, '31-12-2018') AS VARCHAR), 2);
上述查询返回“201801”。
有没有办法简单地获得 2018 年 12 月 31 日的 201901,而无需明确测试该日期?
解决方案
查看可能的重复参考并稍微整理一下:
declare @d datetime = '2018-12-31';
select cast(year(dateadd(day, 26 - datepart(ISO_WEEK, @d), @d)) as varchar(4)) + right(('0' + cast(datepart(ISO_WEEK, @d) as varchar(2))), 2)
结果201901
。
测试代码:
select cast(ds.d as date) as 'date', cast(year(dateadd(day, 26 - datepart(ISO_WEEK, ds.d), ds.d)) as varchar(4)) + right(('0' + cast(datepart(ISO_WEEK, ds.d) as varchar(2))), 2) as "IsoWeek"
from (
select dateadd(day, x.num, '2018-12-30') as d
from (
select h.num + d.num + s.num as num
from (
select 0 num union select 100 num union select 200 num union select 300 num
) h
cross join (
select 0 num union select 10 num union select 20 num union select 30 num
) d
cross join (
select 0 num union select 1 num union select 2 union select 3 num
) s
) x
) ds
order by ds.d
这导致:
日期等周 2018-12-30 201852 2018-12-31 201901 2019-01-01 201901 2019-01-02 201901 2019-01-09 201902 2019-01-10 201902 2019-01-11 201902 2019-01-12 201902 2019-01-19 201903 2019-01-20 201903 2019-01-21 201904 2019-01-22 201904 2019-01-29 201905 2019-01-30 201905 2019-01-31 201905 2019-02-01 201905 2019-04-09 201915 2019-04-10 201915 2019-04-11 201915 2019-04-12 201915 2019-04-19 201916 2019-04-20 201916 2019-04-21 201916 2019-04-22 201917 2019-04-29 201918 2019-04-30 201918 2019-05-01 201918 2019-05-02 201918 2019-05-09 201919 2019-05-10 201919 2019-05-11 201919 2019-05-12 201919 2019-07-18 201929 2019-07-19 201929 2019-07-20 201929 2019-07-21 201929 2019-07-28 201930 2019-07-29 201931 2019-07-30 201931 2019-07-31 201931 2019-08-07 201932 2019-08-08 201932 2019-08-09 201932 2019-08-10 201932 2019-08-17 201933 2019-08-18 201933 2019-08-19 201934 2019-08-20 201934 2019-10-26 201943 2019-10-27 201943 2019-10-28 201944 2019-10-29 201944 2019-11-05 201945 2019-11-06 201945 2019-11-07 201945 2019-11-08 201945 2019-11-15 201946 2019-11-16 201946 2019-11-17 201946 2019-11-18 201947 2019-11-25 201948 2019-11-26 201948 2019-11-27 201948 2019-11-28 201948
推荐阅读
- django - 为什么我无法通过 Django django-social-auth 获取电子邮件用户登录
- javascript - 使用导航器剪贴板从画布 blob 中存储图像/png
- html - 位置粘性和溢出:隐藏
- python - PHP 中的 Python time.time()
- android-date - 在android studio中显示不同时区的时间
- python - Geoseries 意外转换为 pandas.Series
- php - PHP DateTime::createFromFormat 返回错误的日期
- javascript - javascript中是否有任何方法可以为一个HTML元素单独操作一个函数?
- python - Dash/Plotly Express Arguments to update_layout() 的文档
- routes - 有什么方法可以在 Here Routing Service 中发送有关路由的反馈?