【问题标题】:How to create a time of 9pm today in SQL如何在 SQL 中创建今天晚上 9 点的时间
【发布时间】:2016-10-12 23:32:52
【问题描述】:

我正在尝试在查询中获取“今天晚上 9 点”的 smalldatetime 值。我以为我可以使用

DATEADD(HOUR, 21, CONVERT(date, GETDATE()))

但 SQL Server 不喜欢这样 - 我得到错误

日期函数 dateadd 不支持 datepart 小时 输入日期。

解决方法的建议?

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql


    【解决方案1】:

    很简单,只需在转换为date 后将date 转换回datetime

    因此,您将获得current_date 00:00:00,然后加上 21 小时:

    select dateadd(hh, 21, cast(cast(getdate() as date) as datetime))
    

    【讨论】:

    • 是的,我在输入问题后 1 分钟就想到了这个。 :)
    【解决方案2】:

    这是因为dateadd的第三个参数应该是日期时间类型,而不是日期。

    SELECT DATEADD(HOUR, 21, CONVERT(datetime,CONVERT(date, GETDATE())))
    

    【讨论】:

      【解决方案3】:

      只需将 21 / 24.0 添加到今天的日期

       Select dateadd(day, datediff(day, 1, getDate()), 1) + (21 / 24.0)
      

      第一部分,dateadd(day, datediff(day, 1, getDate()), 1),从 getdate() 中剥离时间,

      第二部分,+ (21 / 24.0),增加一天的小数部分,等于上午 9 点

      这是因为在内部,SQL Server 将日期时间表示为两个整数,一个表示日期,(自 1900 年 1 月 1 日以来的天数),第二个整数表示时间,(自午夜以来ticks 的数量),其中它组合成一个十进制值,其中整数部分是日期整数,小数部分是一天的分数,所以如果你在一个日期上加上 0.5,你会得到当天的中午,等等。

      或者,为了比较,使用 dateadd 几个小时,

       Select dateadd(hour, 21, dateadd(day, datediff(day, 1, getDate()), 1))
      

      【讨论】:

      • 是的,cast 不能在这里工作以节省时间,您需要使用 dateadddatediff
      • 您必须将其更改为 21/24.0。然而,这确实是令人困惑的代码,我不喜欢使用日期时间数据类型的补充。使用 dateadd 会更清晰。
      • 啊哈,我没有看到下午,我编辑了答案,使它成为晚上 9 点。是的,这实际上等同于使用dateadd(),而且,我同意,如果您不了解内部结构,则不清楚。我只使用它是因为用dateadd() 替换简单的加法,dateAdd() 的第二个参数必须是任何复杂的表达式,你需要得到你添加小时的日期......而且通常,这个表达式是足够复杂,嵌入到dateAdd() 中,不如简单的添加那么清晰。
      猜你喜欢
      • 2016-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 2018-01-06
      • 2021-12-09
      相关资源
      最近更新 更多