Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在读取当前月份的日期SQL_C#_Sql_Sql Server - Fatal编程技术网

C# 正在读取当前月份的日期SQL

C# 正在读取当前月份的日期SQL,c#,sql,sql-server,C#,Sql,Sql Server,这是我当前的查询,可以正常工作,但从2018-05-01开始的整个月,我仍然需要几天的打印时间,不要跳过,这在sql中可能吗 DECLARE @MinDate DATE = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0) , @MaxDate DATE = DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1); SELECT TOP (DATEDIFF(DAY, @MinDat

这是我当前的查询,可以正常工作,但从2018-05-01开始的整个月,我仍然需要几天的打印时间,不要跳过,这在sql中可能吗

DECLARE @MinDate DATE = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0) , 
    @MaxDate DATE = DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1);

SELECT  TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate) INTO     #MYCALENDAR FROM sys.all_objects a CROSS JOIN sys.all_objects b;

SELECT  
a.LPE_Pensum,  
DATEPART(DAY, CAL.[Date]) AS Tag ,
LEFT(datename(WEEKDAY, CAL.[Date] ),3) AS Datum,
CAL.[Date],
p.ZPZ_Von, 
p.ZPZ_Bis FROM
#MYCALENDAR CAL 
LEFT JOIN Z_PRAESENZZEIT AS p ON CONVERT(DATE, p.ZPZ_Datum) = CONVERT(DATE, CAL.[Date])
LEFT JOIN A_PERSONAL AS a ON a.LPE_ID = p.ZPZ_LPE_ID 
LEFT JOIN A_Arbeitszeitplan AS r on r.LPE_AbteilungID = a.LPE_AbteilungID 
LEFT JOIN A_Abteilung AS b ON b.LPE_AbteilungID = r.LPE_AbteilungID WHERE a.LPE_ID=13
这是一个查询的结果:


感谢您的帮助

首先,请尝试缩进您的查询,这样读是不可能的。其次,您可以创建一个日期表,其中包含您感兴趣的所有日期。在互联网上搜索日期维度,它们将非常适合您的需要。最后,您必须将查询与此表左键联接,以便能够查看数据中不存在的所有日期。 应该是这样的:

SELECT 
  a.LPE_Pensum,  
  dd.[DAY] AS Tag ,
  LEFT(datename(WEEKDAY, p.ZPZ_Datum ),3) AS Datum,  
  p.ZPZ_Datum,p.ZPZ_Von, 
  p.ZPZ_Bis 
FROM [DATE_DIM] dd
  LEFT JOIN Z_PRAESENZZEIT AS p 
    ON dd.[DATE]=DATEPART(DAY, p.ZPZ_Datum)
  LEFT JOIN A_PERSONAL AS a 
    ON a.LPE_ID = p.ZPZ_LPE_ID
   AND a.LPE_ID=13
  LEFT JOIN A_Arbeitszeitplan AS r 
    on r.LPE_AbteilungID = a.LPE_AbteilungID 
  LEFT JOIN A_Abteilung AS b 
    ON b.LPE_AbteilungID = r.LPE_AbteilungID 
WHERE dd.[YEAR]=@YearInterestedIn

dd.[YEAR]=@YearInterestedIn必须替换为您对研究感兴趣的范围

您要扫描特定的日期范围,比如上个月:

DECLARE @MinDate DATE = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0) , -1st day prev month
        @MaxDate DATE = DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1); -- last day prev month
现在,您需要一个日历表来存储日期:

SELECT  TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
        Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)
INTO    #MYCALENDAR
FROM    sys.all_objects a
        CROSS JOIN sys.all_objects b;
我们可以使用新的MYCALENDAR作为查询的基线:

SELECT  
    a.LPE_Pensum,  
    DATEPART(DAY, CAL.[Date]) AS Tag ,
    LEFT(datename(WEEKDAY, CAL.[Date] ),3) AS Datum,
    CAL.[Date],
    p.ZPZ_Von, 
    p.ZPZ_Bis 
FROM
    #MYCALENDAR CAL 
    LEFT JOIN Z_PRAESENZZEIT AS p ON CONVERT(DATE, p.ZPZ_Datum) = CONVERT(DATE, CAL.[Date])
    LEFT JOIN A_PERSONAL AS a ON a.LPE_ID = p.ZPZ_LPE_ID 
    LEFT JOIN A_Arbeitszeitplan AS r on r.LPE_AbteilungID = a.LPE_AbteilungID 
    LEFT JOIN A_Abteilung AS b ON b.LPE_AbteilungID = r.LPE_AbteilungID 
WHERE 
    a.LPE_ID=13

您可能需要更改join子句中的某些内容,但基本上,这就是我将如何进行的。

您需要生成当月的天数。假设数据库中有一些行,则可以使用left join输入日期:

SELECT a.LPE_Pensum, d.dte AS Tag ,
       LEFT(datename(WEEKDAY, d.dte),3) AS Datum,
       p.ZPZ_Datum, p.ZPZ_Von,  p.ZPZ_Bis 
FROM  (SELECT DISTINCT CAST(p.ZPZ_Datum as date) as dte
       FROM Z_PRAESENZZEIT p
       WHERE ZPZ_Datum >= datefromparts(year(p.ZPZ_Datum), month(p.ZPZ_Datum), 1) AND
             ZPZ_Datum >= dateadd(month, 1, datefromparts(year(p.ZPZ_Datum), month(p.ZPZ_Datum), 1))
    ) d LEFT JOIN
    (A_PERSONAL a JOIN
     Z_PRAESENZZEIT p
     ON a.LPE_ID = p.ZPZ_LPE_ID 
    ) 
    ON p.ZPZ_Datum >= d.dte AND p.ZPZ_Datum < DATEADD(day, 1, d.dte) LEFT JOIN
    A_Arbeitszeitplan r
    ON r.LPE_AbteilungID = a.LPE_AbteilungID 
    A_Abteilung b
    ON b.LPE_AbteilungID = r.LPE_AbteilungID 
WHERE a.LPE_ID = 13;


如有必要,您可以以不同的方式生成日期。

为了便于将来参考,请向礼仪-1提问。不要链接到图像。原因有两个:你不能复制/粘贴图像中的数据,而且大多数人都会穿上赛博面包休息一下,所以在工作中不会只关注某个链接。使用示例数据和预期结果发布格式良好的复制/可复制文本。2.我想标记您的DBMS SQL Server。@Error\u 2646您是对的,很抱歉,我是对的new@GrantWinney我不认识他,但我认为他很好-corrected@neven别担心,这是互利的。格式正确的问题更有可能得到快速、高质量的答案。@Error_2646没错,谢谢。就可读性而言,这种格式并不比原始格式好多少。这是一个文本查询墙。你没有在一行中看到原始内容,它发生了变化。我可以看到历史记录,是的,它很糟糕,但告诉某人他们应该格式化查询以使其更易于阅读,然后这…你有什么问题?你无聊吗?对我来说,这个查询很容易阅读,并不是所有的查询都是select*from表。喝杯咖啡是的,使用日期或计数表是这里最好的方法。您好@Gordon Linof,谢谢您的帖子,通过您的代码我发现了这个错误,我如何修复它?DATEFROMPARTS不被识别为内置函数的名称。@neven。这是一个非常有效的SQL Server函数,已被支持多年:。Linof ok,但我在您的案例中有两个错误,因为它打开了两次,另一个错误发生在a_Abteilung b部分,我应该更正吗?感谢您的帖子,但我不知道如何替换此部分*-用真实的a_PERSONAL Date字段*编辑,在那张表中,我没有日期,我的日期在Z_Praesenzeit表中。太好了,这个月的所有日期都已经打印出来了,我还需要添加什么到节目中,以及那个月工人不在场的天数?p.ZPZ_Von中的空值意味着他们没有在场,但是,这是我的结果,日期:1,3,5,15。。。我需要每月的每一天都显示为天,ZPZ_Von和ZPZ_Bis设置为空,如果那天没有数据,请编辑您的主要帖子,显示您当前的输出和所需输出的示例。。。