Sql server 格式为MM.YYYY的T-SQL和处理日期 我目前正在开发一个在后台使用SQL Server的报表应用程序。
数据从csv文件摄取到表中。其中一个文件(包含财务数据)包含格式为MM.YYYY(2015年4月、2016年7月等)的财务期间 稍后,人们会希望根据该时间段查询该数据,例如2015年4月至2016年3月之间的任何数据。显然,在字符串上运行between将不会得到任何结果或不正确的数据 处理这个问题的最佳方法是什么Sql server 格式为MM.YYYY的T-SQL和处理日期 我目前正在开发一个在后台使用SQL Server的报表应用程序。,sql-server,tsql,datetime,casting,type-conversion,Sql Server,Tsql,Datetime,Casting,Type Conversion,数据从csv文件摄取到表中。其中一个文件(包含财务数据)包含格式为MM.YYYY(2015年4月、2016年7月等)的财务期间 稍后,人们会希望根据该时间段查询该数据,例如2015年4月至2016年3月之间的任何数据。显然,在字符串上运行between将不会得到任何结果或不正确的数据 处理这个问题的最佳方法是什么 导入时转换为日期(请记住datetime数据类型需要day) 在WHERE子句中将字符串强制转换为date(在这种情况下,您将如何处理MM.YYYY) 还有其他解决方案吗?你说得对
- 导入时转换为日期(请记住datetime数据类型需要day)
- 在WHERE子句中将字符串强制转换为date(在这种情况下,您将如何处理MM.YYYY)
还有其他解决方案吗?你说得对,将它们存储为字符串会使查询变得缓慢和困难。将这些数据存储为正确的日期可以编制索引并更轻松地进行查询。如果像2015年4月这样的日期表示从2015年4月1日到2015年4月30日的期间,那么我将存储
期间开始
和期间结束
日期列。这使得数据中非常清楚这些日期代表了什么。看看这些
将这些数据解析为正确日期的一种方法是使用德语语言环境(dd.mm.yyyy)。你可以在约会前加上'01'
select convert(date, '01.05.2016', 104)
我更喜欢第一个选项,在导入转换为日期时。您可以使用月的第一天或月的最后一天作为日期。然后,您可以简单地筛选日期 另一个简单的方法是,按照以下格式将财务月数据插入到
整数列中
(YYYY*100)+MM
ie 04.2015 = (2015*100)+04 = 201504
然后,您可以在WHERE子句的这个整数列中简单地过滤它们
... WHERE Fin_Month BETWEEN 201504 AND 201706
我会在导入时转换为日期。所以我问你csv将有每月数据,对吗?所以我们可以在这个月的基础上加上一天,比如说那个月的最后一天?然后在后面的查询中,我们可以使用Convert。您如何将数据从csv导入SQL?这不是日期。你不能没有一天就有约会。最好的选择是在年份和月份使用两个单独的字段。在我看来,这里最大的问题是格式的顺序与它所代表的内容的顺序不同,例如,09.1980大于01.2017。如果您确实希望使用非日期类型的日期相关字符串,请始终确保在左侧有最重要的日期部分,例如YYYY.MM-这样您可以方便地使用索引进行排序等。如果您愿意,您可以将其设置为日期,哲学上的问题是,01-MM-YYYY的概念实际上是一天的任意发明,以使其适合特定的类型使用两列存储相同的信息是一种浪费。它不是相同的信息,因为输入不是日期,而是周期。存储月份的第一天或最后一天实际上会生成一个虚假的日值。一个设计选项是分别存储年份和日期。或者将数据视为一个范围,并指定其开始日期和结束日期。存储范围允许使用可能需要也可能不需要的日期函数谢谢@mroach。无论如何,在我的案例场景中,两列方法是最可行的解决方案。@PanagiotisKanavos使用两列存储与2017-03-01、2017-03-31相同的varchar列“032017”中的月初和月底信息。您没有从月末获得任何附加值032017
只是一个不可排序、不可排序的字符串,它不提供任何日期或期间信息。你可能会争论201703
,但这仍然比将年份和月份存储在单独的列中需要更多的存储空间。你实际上是这样破坏了正常化。如果您必须转换该值,则可能有问题。附言:我肯定乔·塞尔科有一篇关于这件事的文章