【问题标题】:How to check the day name from date. but from procedure I have getting wrong day as per the date so please help me如何从日期检查日期名称。但是从程序来看,我的日期有误,所以请帮帮我
【发布时间】:2021-02-21 22:58:01
【问题描述】:

这是我的 SQL Server 代码:

CREATE PROCEDURE [dbo].[usp_GetLeaveDateBewteenStartAndEndDate]      
    (@UserEmail VARCHAR(100) = NULL,      
     @FromDate VARCHAR(10) = NULL,      
     @ToDate VARCHAR(10) = NULL)      
AS      
BEGIN      
    --SELECT       
    --GETDATE() AS [Date]      
    --,CONVERT(VARCHAR(10),GETDATE(),103) AS ShortDate      
    --,'Monday' as [DayName]      
    --,'Full Day' as [Session]      
    --, 1 as NoOfDays      
    --,'Work Day' as [Status]      
    --,'W' as StatusCode      
    
     DECLARE @Result AS TABLE    
                        (    
                            Date       DATETIME,
                            ShortDate  VARCHAR(50),
                            DayNames   VARCHAR(50),    
                            Session    VARCHAR(20),    
                            NoOfDays   INT,
                            Status     VARCHAR(50),    
                            StatusCode VARCHAR(2)    
                        )        
       
    DECLARE @dayscount INT 

    SET @dayscount =  CAST(DATEDIFF(DAY, CONVERT(DATE, @FromDate, 103), CONVERT(DATE, @ToDate, 103)) AS INT) + 1

    DECLARE @daysval INT
    SET @daysval = 0

    WHILE (@daysval < @dayscount)
    BEGIN
        INSERT INTO @Result (Date, ShortDate, DayNames, Session, NoOfDays, Status, StatusCode)    
        VALUES (CONVERT(DATETIME, DATEADD(DAY, @daysval, CONVERT(DATE, @FromDate, 103)), 103), CONVERT(VARCHAR(50), DATEADD(DAY, @daysval, CONVERT(DATE, @FromDate, 103)), 103),     
                DATENAME(dw, CONVERT(VARCHAR(50), DATEADD(DAY, @daysval, '07/02/2021'), 103)), 
                'Full Session', 1, 'Work Day', 'W')    
    
        SET @daysval = @daysval + 1

        DECLARE @daycheck NVARCHAR(100)

        SELECT @daycheck = DayNames 
        FROM @Result
   
        IF (@daycheck = 'sunday')
        BEGIN
            UPDATE @Result
            SET Status = '', StatusCode = ''
        END
    END
      
    SELECT * FROM @Result   
END

在执行我的查询后,我得到了这个结果:

EXEC [dbo].[usp_GetLeaveDateBewteenStartAndEndDate] NULL, '03/02/2021', '05/02/2021'

Date    ShortDate   DayNames    Session NoOfDays    Status  StatusCode  
-----------------------------------------------------------------------
2021-02-03 00:00:00.000 03/02/2021  Sunday  Full Session    1       
2021-02-04 00:00:00.000 04/02/2021  Sunday  Full Session    1       
2021-02-05 00:00:00.000 05/02/2021  Wednesday   Full Session    1   Work Day    W

对于 2021 年 1 月 2 日,daynames 应该是星期一,05/02/2021 应该是星期二。

【问题讨论】:

  • 到底为什么要将日期转换为varchar 只是为了将它们传回日期函数,将日期保留为日期。而且您需要学习如何使用计数表/功能。

标签: sql sql-server


【解决方案1】:

我无法确定您为什么会看到这些结果,因为我没有您的输入参数。但是您的代码中有一些基本错误

  1. select @daycheck = DayNames from @Result 不检查它要求的行。
  2. update @Result set Status = '' , StatusCode = '' 也有同样的问题。
  3. 您正在将日期转换为varchar 左右。 将值保留为应有的格式,并在需要显示的地方进行转换。
  4. 此外,您应该以 date 而不是 varchar 传递 From 和 To 日期。
  5. 不需要while 循环或表变量来完成这一切。 可以使用计数表来完成。我在下面使用了Itzik Ben-Gan's well-known one
WITH
    L0 AS ( SELECT 1 AS c 
            FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),
                        (1),(1),(1),(1),(1),(1),(1),(1)) AS D(c) ),
    L1 AS ( SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B ),
    L2 AS ( SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B ),
    L3 AS ( SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B ),
    Nums AS ( SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum
              FROM L3 ),
    Dates AS (
        SELECT TOP( DATEDIFF(day, @FromDate, @ToDate) + 1 )
            DATEADD(day, rownum - 1, @FromDate) AS dateVal
        FROM Nums
    )

SELECT
    dateVal AS Date,
    CONVERT(Varchar(50), dateVal, 103) AS ShortDate,
    v.DayNames,
    'Full Session' AS Session,
    1 AS NoOfDays,
    CASE WHEN v.DayNames = 'Sunday' THEN '' ELSE 'Work Day' END AS Status,
    CASE WHEN v.DayNames = 'Sunday' THEN '' ELSE 'W' END AS StatusCode
FROM Dates
CROSS APPLY (VALUES (DATENAME(dw, dateVal) ) ) AS v(DayNames)

【讨论】:

  • 输出没问题,但问题是日期 03/02/2021 和 04/02/2021 都显示为星期三,但 04.02.2021 将是星期四。日期名称不能更改,那是我的问题更新正在运行。请帮助我获取未填充正确数据的日期名称
  • 对不起,我收到04/02/2021 | Thursday,除了参数之外,您是否更改了我的代码?
  • 你的代码输出没问题,但是当我在你的代码中传递参数 '10/02/2021' DD/MM/YYYY 时,它被认为是 '02/10/2021' 我需要相同的格式
  • 这与您的服务器设置有关,可能是美国设置。始终以明确的格式 'YYYY-MM-DD HH:MM:SS 编写日期文字,以防止混淆。将您的参数声明为 @FromDate date 而不是 varchar
猜你喜欢
  • 2020-05-18
  • 1970-01-01
  • 2015-02-24
  • 2012-01-12
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多