Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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
Sql server 格式为MM.YYYY的T-SQL和处理日期 我目前正在开发一个在后台使用SQL Server的报表应用程序。_Sql Server_Tsql_Datetime_Casting_Type Conversion - Fatal编程技术网

Sql server 格式为MM.YYYY的T-SQL和处理日期 我目前正在开发一个在后台使用SQL Server的报表应用程序。

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) 还有其他解决方案吗?你说得对

数据从csv文件摄取到表中。其中一个文件(包含财务数据)包含格式为MM.YYYY(2015年4月、2016年7月等)的财务期间

稍后,人们会希望根据该时间段查询该数据,例如2015年4月至2016年3月之间的任何数据。显然,在字符串上运行between将不会得到任何结果或不正确的数据

处理这个问题的最佳方法是什么

  • 导入时转换为日期(请记住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
,但这仍然比将年份和月份存储在单独的列中需要更多的存储空间。你实际上是这样破坏了正常化。如果您必须转换该值,则可能有问题。附言:我肯定乔·塞尔科有一篇关于这件事的文章