【问题标题】:Save DateTime in mssql 2005 without hours, minutes and seconds在 mssql 2005 中保存 DateTime 没有小时、分钟和秒
【发布时间】:2009-03-27 08:26:10
【问题描述】:

我想将 sql2005 中的日期保存为日期(不包括小时、分钟和秒)。 我想这样做是因为如果填写了小时、分钟和秒,则 between 函数并不总是正确的。

但 datetime 和 smalldatetime 都不允许这样做,在 2008 年,您拥有可以执行此操作的 Date 列。

我也发现了这个问题,它可以帮助我,但我不喜欢强制转换来执行我的查询:How to remove the time portion of a datetime value (SQL Server)?

【问题讨论】:

  • 如果由于日期时间不是 00:00:00.000 而导致 BETWEEN 无法工作,请修复 BETWEENS,而不是数据!

标签: sql sql-server datetime


【解决方案1】:

非铸造方式:

SET @d = DATEADD(dd, 0, DATEDIFF(dd, 0, @dt))

这会将 0 和您的日期之间的天数加到 0,导致时间部分为零。

如果这比显式 CAST 方法更快,则必须进行测试。使用 0 表示将在此表达式中进行一些隐式转换。

【讨论】:

  • @Sem 铸造方式并不快。请参阅this post for more detail
  • @Sem 对于那些幸运地离开 SQL 2005 甚至 SQL 2000... :)
  • @Tomalak 我不认为对文字的隐式强制转换比显式强制转换慢。
【解决方案2】:
SELECT CONVERT (date, GETDATE()) -- Without hours, minutes and seconds.

更多详情请参考http://msdn.microsoft.com/en-us/library/ms188383.aspx

【讨论】:

    【解决方案3】:

    您可以做的是确保存储的日期在将它们发送到数据库之前没有分钟和秒。如果您根据现有日期时间创建日期时间,但将小时、分钟和秒设置为零,那么从您的应用程序代码中这应该非常简单

    【讨论】:

      【解决方案4】:

      如果所有其他方法都失败了,您可以将其存储为从某个时间点开始的秒数整数值。这将允许您将其与以相同方式存储的其他日期进行比较,而无需强制转换。

      【讨论】:

      • 您不需要编写任何复杂的代码来执行此操作 - 只需强制转换 (DateTimeValue as int)。
      【解决方案5】:

      如果你在 .NET 中工作,你可以使用

      DateTime.Now.Date
      

      只为您提供日期时间的日期部分。

      【讨论】:

      • 是的,这很公平。我确实做了一个很大的假设,认为这可能是合适的。
      【解决方案6】:

      BETWEEN 不起作用,因为日期时间的时间不是 00:00:00.000,因此请修复 BETWEENS,而不是数据。

      这将返回一天内的所有数据,与时间无关

      DECLARE @FilterDate datetime
      SET @FilterDate='3/18/2009'
      
      QUERY
          ...
          WHERE Column1 >= @FilterDate AND Column1 < @FilterDate + 1
      

      这将返回一个日期范围内的所有数据,与时间无关

      DECLARE @StartFilterDate datetime
      DECLARE @EndFilterDate datetime
      SET @StartFilterDate ='3/18/2009'
      SET @EndFilterDate ='3/30/2009'
      
      QUERY
          ...
          WHERE Column1 >= @StartFilterDate AND Column1 < @EndFilterDate + 1
      

      【讨论】:

        【解决方案7】:
        SELECT CONVERT(DATETIME, CONVERT(DATE, GETDATE()))
        

        【讨论】:

        • 它为当前的答案增加了什么?
        【解决方案8】:

        今天的楼层日期和时间如下图所示:

        select DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多