我将历史记录数据作为日期类型(2019-10-10)存储在SQL Server中。如果一天是星期六或星期日,我想检查一下并返回星期五。
周末没有数据。这就是为什么我想在周末获取星期五的数据。
答案 0 :(得分:2)
( @@DateFirst + DatePart( weekday, SampleDate ) - 1 ) % 7 + 1
将始终从1
到7
返回一个整数,其中1
对应于星期日,而不管DateFirst
或Language
的设置如何
您可以使用以下代码将周末日期推回到上一个星期五:
-- Get the current date (without time).
declare @Today as Date = GetDate();
-- Move Saturday or Sunday dates back to the prior Friday.
select @Today as Today,
case ( @@DateFirst + DatePart( weekday, @Today ) - 1 ) % 7 + 1
when 1 then DateAdd( day, -2, @Today ) -- Sunday.
when 7 then DateAdd( day, -1, @Today ) -- Saturday.
else @Today end as ReportDate;
答案 1 :(得分:1)
一种选择是将Choose()
与DateAdd()
一起使用
示例
示例
Declare @YourTable table (DateCol date)
Insert Into @YourTable values
('2019-10-14')
,('2019-10-15')
,('2019-10-16')
,('2019-10-17')
,('2019-10-18')
,('2019-10-19')
,('2019-10-20')
Select DateCol
,ActDay = datename(WEEKDAY,DateCol)
,AdjDay = dateadd(DAY,choose(DatePart(WEEKDAY,DateCol),-2,0,0,0,0,0,-1),DateCol)
From @YourTable
返回
DateCol ActDay AdjDay
2019-10-14 Monday 2019-10-14
2019-10-15 Tuesday 2019-10-15
2019-10-16 Wednesday 2019-10-16
2019-10-17 Thursday 2019-10-17
2019-10-18 Friday 2019-10-18
2019-10-19 Saturday 2019-10-18 << Friday's Date
2019-10-20 Sunday 2019-10-18 << Friday's Date
答案 2 :(得分:1)
最安全的方法可能是在星期几使用format()
:
select (case format(col, 'ddd', 'en-us')
when 'Sat' then dateadd(day, -1, col)
when 'Sun' then dateadd(day, -2, col)
else col
end)
由于格式采用了区域性参数,因此无论设置如何影响日期格式或datename()
返回的语言,该设置均有效。
答案 3 :(得分:0)
希望这会有所帮助:
创建测试表:
create table HistorySave(Datum date);
插入一些测试值:
Insert into HistorySave values (CONVERT(DATETIME, '2012-06-05', 102));
Insert into HistorySave values (CONVERT(DATETIME, '2012-06-04', 102));
Insert into HistorySave values (CONVERT(DATETIME, '2012-06-03', 102));
Insert into HistorySave values (CONVERT(DATETIME, '2012-06-09', 102));
检查所插入数据中的日期
SELECT DATENAME(DW, CONVERT(DATETIME, DATUM, 102)) FROM HistorySave;
在更新之前检查数据:
select * from HistorySave;
更新声明:
UPDATE HistorySave
SET Datum =
CASE
WHEN DATENAME(DW, CONVERT(DATETIME, Datum, 102)) = 'Saturday'
THEN (CONVERT(DATETIME, Datum, 102) -1)
WHEN DATENAME(DW, CONVERT(DATETIME, Datum, 102)) = 'Sunday'
THEN (CONVERT(DATETIME, Datum, 102) -2)
ELSE
DATUM
END
更新后检查数据:
select * from HistorySave;
演示:
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=358aaefe516da8dd96e1da73ce4d5f38
答案 4 :(得分:0)
您需要进行以下更新
Update table set column=(select
column
From table where to_char(date,
'Day') ='FRI') where to_char(date,
'Day') LIKE 'S%' ;
答案 5 :(得分:-1)
天数等于sql服务器中的数字:
7 -> Sunday
1 -> Monday
2 -> Tuesday
3 -> Wednesday
4 -> Thursday
5 -> Friday
6 -> Saturday
DATEPART(DW, GETDATE())
为您提供当日的数字。
在ms sql服务器的IF AND ELSE中使用它。
例如:
如果天是星期六(6),请用负1表示星期五。
IF(DATEPART(DW, GETDATE()) = 6)
SELECT * FROM table WHERE date=dateadd(day, -1, cast(GETDATE() as date))