Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/133.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#/EF核心:使用(历史)日期/期间_C#_Asp.net Core Mvc_Entity Framework Core_Database Schema - Fatal编程技术网

C#/EF核心:使用(历史)日期/期间

C#/EF核心:使用(历史)日期/期间,c#,asp.net-core-mvc,entity-framework-core,database-schema,C#,Asp.net Core Mvc,Entity Framework Core,Database Schema,给出了一个使用ASP.NET核心的C#网站,Mvc使用SQL Server和EF核心 对于一个爱好项目,我正在寻找旧报纸,文件和特定的建筑物搜索。每次我找到这样一个建筑的信息时,我都试着写下日期信息。这样我就可以知道这座建筑在哪一个时期 假设我遇到了X号建筑,看到了1880年的日期。我把日期写在1880年。 几周后,我再次遇到X大楼,看到日期:1877年3月16日。我现在知道,从1877年3月16日到1880年,这座建筑肯定在那里 期间:1877年3月16日至1880年 现在有些建筑物没有任何

给出了一个使用ASP.NET核心的C#网站,Mvc使用SQL Server和EF核心

对于一个爱好项目,我正在寻找旧报纸,文件和特定的建筑物搜索。每次我找到这样一个建筑的信息时,我都试着写下日期信息。这样我就可以知道这座建筑在哪一个时期

假设我遇到了X号建筑,看到了1880年的日期。我把日期写在1880年。 几周后,我再次遇到X大楼,看到日期:1877年3月16日。我现在知道,从1877年3月16日到1880年,这座建筑肯定在那里

期间:1877年3月16日至1880年

  • 现在有些建筑物没有任何日期信息
  • 有些建筑只有一个日期(可能需要额外研究才能找到另一个日期)
  • 一些建筑物可能有信息表明它存在于17世纪(没有具体的年份或日期)
  • 日期可以包含年、年+月或年+月+日
现在,最好将其存储在数据库中并在模型中表示

模型上的两个属性是否足够

public class Building {
[DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
  public DateTime? Date1 { get; set; }
[DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime? Date2 { get; set; }
}
它是否适用于网站上的搜索过滤器。例如,搜索1830-1930年间的所有东西或17世纪的所有东西

对于最后一个问题,我的意思是,如果一个建筑只有一个日期(例如1835年),您将如何编写linq查询。如果只给出一个日期,每个查询是否会额外检查可为空的日期?还是有更好的方案


.Where(x=>x.Date1!=null&&x.Date1>=1830&&(x.Date2==null | | x.Date2实际上,您的问题归结为显示精确的与“模糊”的日期。没有单一的策略,但我以前有过类似的需求,并通过设置开始日期、结束日期和结束日期来处理它,所有这些都可以为null

如果您知道日期的任何确切部分,则使用实际日期时间字段。例如,如果您知道的全部是1880,则将其存储为
1880-01-01
。如果您知道年份和月份,则只需将日期设置为
01
,当然,如果您知道完整日期,则将其存储。当然,这可能是个问题c、 你怎么知道它不是1880年1月1日建造的,而只是一般的1880年建造的?好吧,这取决于你决定如何处理这些情况。你可以假设任何
01
都与该日期部分的空值相同。出于任何原因,建筑物都不会在1月1日或任何周一的1日开放但总有例外

如果您确实需要更高的精度,您可能需要将日期拆分并按年份、月份和日期存储—所有可为空的int列。然后,当需要显示时,您可以随意将其拼凑在一起

“模糊”日期栏是字符串,你可以在其中存储更多的星云“日期”,如“维多利亚时代”,也就是说,你可能没有一个真实的日期,甚至没有年份,但你知道它是在某段时间内。你可以对“19世纪”这样的东西做同样的事情,但我个人更喜欢将其存储为1800-01-01,然后直觉地认为,当有该表单的日期时,它应该显示为“19世纪”

另一种选择是同时使用日期和模糊文本。例如,您可以将其存储为1800-01-01和“19世纪”,然后您可以根据模糊文本不为空的情况确定它不是1800年1月1日。这有助于解决前面描述的歧义问题,因为您可以在所有此类情况下这样做。例如,如果您只知道“1880年7月”,然后您可以将其存储在模糊文本中,并将日期设置为
1880-07-01
。然后,根据模糊文本的存在,您可以选择将
01
部分破译为基本为空,而不是字面上的月初。如果没有设置模糊文本,则您假定它是一个准确的日期


就在您的模型上表示它而言,我不会使用实际的
DateTime
属性或
DisplayFormat
。最好使用实用方法来处理逻辑并返回预格式化的“日期”。然后您只需执行类似
@building.GetBuiltDisplay()的操作
,并返回您知道的所有信息(包括开始和结束,如果有的话)已经格式化。

在一年中,我认为您的日期是从1月1日到12月31日,直到您遇到一个建筑物被摧毁或建造的日期,该日期可能会调整该范围的任意一端。对于一个日期,则只需将两者都设置为该日期。这取决于您将保存的有关该建筑物的其他属性。。。如果您只想知道建筑物是否在某个特定的日期时间在这里,那么如果新建筑物较旧,让我们覆盖该日期。如果您想跟踪建筑物的使用寿命(创建、火灾、破坏等)你应该看看事件来源这是高度基于观点的。在我最近看的一个更有趣的项目中,他们以非常有趣的方式完成了:int century,int?year,datetime2?exact_date。如果已知世纪和/或年份,则确切日期并不重要(可以通过已知数据广泛筛选)。当然,这会占用更多空间,但比处理1899-12-31左右的任意日期要容易得多。编辑:project是用于历史项目跟踪的个人收集系统。@ChrisPratt:“年、月、日-所有可为空的int列。”为什么不使用ushort,byte,byte?