許多人建議如何獲得當年的第一個日期(基于月)。 例如:
SELECT DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0>)
這將導致:
20210101 00: 00: 00. 000[/span]。
應該是2021-01-04。(美國的星期一(星期日)的第一周)
我需要的是類似的,但以周為單位。例如,第一周可能從12月31日開始,所以這個函式應該回傳12月31日,而不是1月1日。
有什么想法嗎?
有什么想法嗎?
uj5u.com熱心網友回復:
所以我想出了一個解決方案,但可能有一個更優雅的解決方案
。
-- =============================================
-- 作者。 PLANSIS
--創建日期: 2020-11-25
-- 說明:基于本年度第一周的第一天(第一周的星期一) -- 說明:基于本年度第一周的第一天(第一周的星期一)-- =============================================
創建 或 更改 程式 [dbo].[A_FN_TI_FirstDayCurrentYearWeek]
(
@date date = null
)
RETURNS datetime
AS AS
BEGIN BEGIN
set @date = coalesce( @date , getdate( ) )
DECLARE @ResultVar datetime
DECLARE @wk int
DECLARE @yr int
SET @yr = year(@date)。
SET @wk = 1
SELECT @ResultVar = dateadd (week, @wk, dateadd (year, @yr1900, 0) - 4 -
datepart(dw, dateadd (week, @wk, dateadd (year, @yr1900, 0) - 4) 2 -- 2代表歐洲, 1代表美國。
-- 回傳函式的結果。
RETURN @ResultVar
END
uj5u.com熱心網友回復:
為此使用行內表值函式要比標量函式好得多(一些細節在這里)。
我創建了一個函式,根據上面評論中顯示的所需結果,生成任何給定日期的年份的第一個星期一。如果你想要周日的資料,請在你的問題中提供樣本資料/所需的結果:
我創建了一個生成任何給定日期的第一個周一的程式。
CREATE FUNCTION dbo.GetFirstMonday
(
@datedate
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN[/span
(
WITH km(km) AS (SELECT CONVERT(date, '20180101')), --已知周一。
d AS (SELECT FirstOfYear = DATEFROMPARTS(YEAR(@date) 。 1,1))。)
w AS (SELECT FirstMonday = DATEADD(WEEK, DATEDIFF(WEEK, km, FirstOfYear)
CASE WHEN ((@@DATEFIRST DATEPART(WEEKDAY, FirstOfYear)) IN (6,13)
THEN 1 ELSE 0 END, km) FROM d CROSS JOIN km)
SELECT FirstMonday FROM w
);
使用方法:
SET DATEFIRST 5;
DECLARE @src TABLE(InputDate date)。
INSERT @src(InputDate) VALUES
('20160608'),('20170505'),('20180405') 。
('20190303'),('20200903'),('20210706')。
SELECT * FROM @src As src
CROSS APPLY dbo.GetFirstMonday(src.InputDate)。
結果(對于任何DATEFIRST設定):
InputDate FirstMonday
---------- -----------
2016-06-08 2016-01-04
2017-05-05 2017-01-02
2018-04-05 2018-01-01
2019-03-03 2018-12-31
2020-09-03 2019-12-30
2021-07-06 2021-01-04
- 示例 db<>fiddle
但實際上,如果只是少數年份中的一個星期天或星期一,而且你已經知道了規則,為什么不直接創建一個表,一次性定義這些規則,而不是想出古怪的、公開的靈活語法呢?
CREATE TABLE dbo.FirstSundayMondayRules
(
TheYear int PRIMARY KEY。
FirstSunday date NOT NULL,
FirstMonday date NOT NULL.
);
--在這里猜測一下你的周日規則。
INSERTdbo.FirstSundayMondayRules VALUES
(2016, '20160103'/span>, '20160104'/span>)。
(2019, '20181230', '20181231')。)
現在你可以創建一個更簡單的函式:
CREATE FUNCTION dbo.GetFirstWeekday
(
@Date date,
@DayName char(6)
)
RETURNS TABLE WITH SCHEMABINDING
AS
RETURN (SELECT FirstWeekday = CASE @DayName)
WHEN 'Sunday THEN FirstSunday
WHEN 'Monday' THEN FirstMonday END
FROM dbo.FirstSundayMondayRules
WHERE TheYear = DATEPART(YEAR, @Date)
);
而DATEFIRST已經沒有任何意義,至少作為任何計算的一部分:
SET DATEFIRST 5;
DECLARE @src TABLE(InputDate date)。
INSERT @src(InputDate) VALUES
('20160608'),('20190303') 。
SELECT '星期日'。* FROM @src AS src
CROSS APPLY dbo.GetFirstWeekday(src.InputDate, 'Sunday') 。
SELECT '星期一', * FROM @src AS src
CROSS APPLY dbo.GetFirstWeekday(src.InputDate, 'Monday') 。
結果:
(No column name) InputDate FirstWeekday
---------------- ---------- ------------
星期日 2016-06-08 2016-01-03
星期日 2019-03-03 2018-12-30
(無列名)輸入日期 第一個作業日
---------------- ---------- ------------
星期一 2016-06-08 2016-01-04
周一 2019-03-03 2018-12-31
或者更好的是,給自己找一個日歷表,你就可以在其中設定一些列,硬編碼FirstSundayOfYear和FirstMondayOfYear。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/323132.html
標籤:
