如果SQL Server中的日期是周末(周六-周日),则返回星期五

如果SQL Server中的日期是周末(周六-周日),则返回星期五,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我正在SQL Server中将历史数据存储为日期类型2019-10-10。如果是星期六或星期天,我想检查并返回星期五 周末没有数据。这就是为什么如果是周末,我想获取周五的数据。天数等于sql server中的数字: 7 -> Sunday 1 -> Monday 2 -> Tuesday 3 -> Wednesday 4 -> Thursday 5 -> Friday 6 -> Saturday DATEPARTDW,GETDATE以数字形式提供当前日

我正在SQL Server中将历史数据存储为日期类型2019-10-10。如果是星期六或星期天,我想检查并返回星期五


周末没有数据。这就是为什么如果是周末,我想获取周五的数据。

天数等于sql server中的数字:

7 -> Sunday
1 -> Monday
2 -> Tuesday
3 -> Wednesday
4 -> Thursday
5 -> Friday
6 -> Saturday
DATEPARTDW,GETDATE以数字形式提供当前日期

在IF和ms sql server中使用它

例如:

如果一天是星期六,用-1表示星期五

IF(DATEPART(DW, GETDATE()) = 6)
SELECT * FROM table WHERE date=dateadd(day, -1, cast(GETDATE() as date))

天数等于sql server中的数字:

7 -> Sunday
1 -> Monday
2 -> Tuesday
3 -> Wednesday
4 -> Thursday
5 -> Friday
6 -> Saturday
DATEPARTDW,GETDATE以数字形式提供当前日期

在IF和ms sql server中使用它

例如:

如果一天是星期六,用-1表示星期五

IF(DATEPART(DW, GETDATE()) = 6)
SELECT * FROM table WHERE date=dateadd(day, -1, cast(GETDATE() as date))
一个选项是将Choose与DateAdd配合使用 范例

范例

返回

一个选项是将Choose与DateAdd配合使用 范例

范例

返回


最安全的方法可能是使用星期几的格式:

select (case format(col, 'ddd', 'en-us')
           when 'Sat' then dateadd(day, -1, col)
           when 'Sun' then dateadd(day, -2, col)
           else col
        end)

因为format采用区域性参数,所以无论可能影响datename返回的日期格式或语言的设置如何,该方法都有效。

最安全的方法可能是使用星期几的格式:

select (case format(col, 'ddd', 'en-us')
           when 'Sat' then dateadd(day, -1, col)
           when 'Sun' then dateadd(day, -2, col)
           else col
        end)
因为format采用区域性参数,所以无论可能影响datename返回的日期格式或语言的设置如何,该选项都有效。

希望这对您有所帮助:

为测试创建表:

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;
演示:

希望这有助于:

为测试创建表:

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;
演示:


你需要更新如下

        Update table set column=(select 
          column
         From table where to_char(date, 
         'Day') ='FRI') where to_char(date, 
         'Day') LIKE 'S%' ;

你需要更新如下

        Update table set column=(select 
          column
         From table where to_char(date, 
         'Day') ='FRI') where to_char(date, 
         'Day') LIKE 'S%' ;
@@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;
@@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;

在sql server中,天数等于数字:这完全取决于您的语言。但是,请注意,今天没有人返回0,您关于0->Sunday的声明恐怕在所有方面都是错误的。这是我的错。我已经尝试并更新了解决方案。它对我有用。我注意到语言的变化。问候。在sql server中,天数等于数字:这完全取决于您的语言。但是,请注意,今天没有人返回0,您关于0->Sunday的声明恐怕在所有方面都是错误的。这是我的错。我已经尝试并更新了解决方案。它对我有用。我注意到语言的变化。向你问好吗?不在tsql.to_char中?不在tsql中。这是最健壮的解决方案,因为它考虑了DATEFIRST设置。这是最健壮的解决方案,因为它考虑了DATEFIRST设置。