【问题标题】:.Net / SQL Server: Compare dates (datetime<->datetime, datetime<->varchar).Net / SQL Server:比较日期(日期时间<->日期时间,日期时间<->varchar)
【发布时间】:2016-09-19 09:39:18
【问题描述】:

我在两个项目中有两个问题,都与日期时间有关。

项目 1

日期在 SQL Server 2008 数据库中保存为yyyy/MM/dd,但System.DateTime.Now.ToShortDateString() 返回dd/MM/yyyy。作为内联代码编写的 SQL 查询无法比较两个日期。我尝试了ParseExactCASTConvert 和许多其他选项,但无法让它发挥作用。

项目 2

在 SQL Server 2008 数据库中,日期时间保存在 varchar(50) 列中。即使在尝试了很多选项后,使用 Between 子句也无法通过内联 SQL 查询。

注意:我在前端和后端使用快速版本。

请在这两个方面提供帮助。提前致谢。

【问题讨论】:

  • 如果您要存储日期和时间,请勿使用varchar(50) !!干净利落。使用适当的数据类型——DATE,如果您只需要日期(没有时间),或者DATETIME2(n),如果您需要日期和时间部分。
  • "在 SQL Server 2008 数据库中,日期时间保存在 varchar(50) 列中。" - 你到底为什么会?认真的。

标签: sql asp.net sql-server-2008 datetime


【解决方案1】:

对于 .NET 中的任何 DateTime,您都可以在 tostring 函数中提供日期时间格式。有了这个,你可以强制你的日期时间被格式化为与 SQL Server 相同的格式以进行比较。

【讨论】:

  • 您应该将日期/时间转换为 字符串 进行比较 - 您应该将它们保留为 native DATETIME 输入并比较它们! (因为它们独立于任何格式和其他废话!)
【解决方案2】:

项目 1:解决方案

您可以将日期转换为以下格式:

select convert(varchar,dateadd(MI, 330, GETUTCDATE()),111)

输出:2016/05/22

项目 2:解决方案

您可以使用下面的查询来搜索而不是使用between

select * from yourtablename
where (datecolumn>=convert(varchar,dateadd(MI, 330, GETUTCDATE()),111) and 
datecolumn<=convert(varchar,dateadd(MI, 330, GETUTCDATE()),111))

试着告诉我,该死的肯定会奏效的..

问候: 克

【讨论】:

  • Bad habits to kick : declaring VARCHAR without (length) - 您应该始终为您使用的任何varchar 变量和参数提供长度(包括在CONVERT 调用中使用它们时!)
  • 是的,但是这里只是单独转换格式,不需要声明长度,上面的代码可以正常工作。
猜你喜欢
  • 2015-07-20
  • 2014-09-11
  • 2012-01-20
  • 1970-01-01
  • 2018-03-10
  • 2020-12-16
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多