【问题标题】:Get only the Date part of DateTime in mssql [duplicate]在mssql中仅获取DateTime的Date部分[重复]
【发布时间】:2010-10-08 16:41:38
【问题描述】:

可能重复:
Get just the Date from grouping in select from DateTime column in SQL Server

如何仅获取 DateTime 的 Date 部分?我正在寻找类似 year() 函数的东西,但要寻找整个日期。

【问题讨论】:

标签: sql-server datetime


【解决方案1】:

这也可能有帮助:

SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM (or PM)
                                        -- Oct  2 2008 11:01AM
SELECT convert(varchar, getdate(), 101) -- mm/dd/yyyy - 10/02/2008                  
SELECT convert(varchar, getdate(), 102) -- yyyy.mm.dd – 2008.10.02           
SELECT convert(varchar, getdate(), 103) -- dd/mm/yyyy
SELECT convert(varchar, getdate(), 104) -- dd.mm.yyyy
SELECT convert(varchar, getdate(), 105) -- dd-mm-yyyy
SELECT convert(varchar, getdate(), 106) -- dd mon yyyy
SELECT convert(varchar, getdate(), 107) -- mon dd, yyyy
SELECT convert(varchar, getdate(), 108) --  hh:mm:ss
SELECT convert(varchar, getdate(), 109) -- mon dd yyyy hh:mm:ss:mmmAM (or PM)
                                        -- Oct  2 2008 11:02:44:013AM   
SELECT convert(varchar, getdate(), 110) -- mm-dd-yyyy
SELECT convert(varchar, getdate(), 111) -- yyyy/mm/dd
SELECT convert(varchar, getdate(), 112) -- yyyymmdd
SELECT convert(varchar, getdate(), 113) -- dd mon yyyy hh:mm:ss:mmm
                                        --  02 Oct 2008 11:02:07:577     
SELECT convert(varchar, getdate(), 114) -- hh:mm:ss:mmm(24h)
SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)
SELECT convert(varchar, getdate(), 121) --  yyyy-mm-dd hh:mm:ss.mmm
SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
                                        --  2008-10-02T10:52:47.513
-- SQL create different date styles with t-sql string functions
SELECT replace(convert(varchar, getdate(), 111), '/', ' ') -- yyyy mm dd
SELECT convert(varchar(7), getdate(), 126)                 -- yyyy-mm
SELECT right(convert(varchar, getdate(), 106), 8)          -- mon yyyy

The Source

【讨论】:

    【解决方案2】:

    您想要的解决方案是这里提出的解决方案:

    https://stackoverflow.com/a/542802/50776

    基本上,你这样做:

    cast(floor(cast(@dateVariable as float)) as datetime)
    

    链接中有一个函数定义,可让您整合功能并根据需要在任何地方调用它(而不必记住它)。

    【讨论】:

    • 这里是更好的答案stackoverflow.com/questions/113045/…
    • 当我尝试使用上面的示例(在 MSSQL-2012 中)创建存储过程时,我收到以下错误:Msg 529, Level 16, State 2, Procedure xxxx, Line 136 [Batch Start Line 9] 不允许从数据类型 date 到 float 的显式转换。
    • 如果您使用的是 2008 及更高版本的 MSSQL 服务器,也可以使用 cast(@dateVariable as date)。
    【解决方案3】:

    另一个漂亮的方法是:

    DATEADD(dd, 0, DATEDIFF(dd, 0, [YourDate]))
    

    获取从 DAY 0 到 YourDate 的天数,并将其添加到 DAY 0 以再次设置基线。此方法(或其“衍生物”)可用于许多其他日期操作。

    编辑 - 其他日期计算:

    每月的第一天:

    DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
    

    一年的第一天:

    DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
    

    本季度的第一天:

    DATEADD(qq, DATEDIFF(qq, 0, getdate()), 0)
    

    上个月的最后一天:

    DATEADD(ms, -3, DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0))
    

    当月最后一天:

    DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, getdate()) + 1, 0))
    

    当年的最后一天:

    DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, getdate()) + 1, 0))
    

    每月的第一个星期一:

    DATEADD(wk, DATEDIFF(wk, 0, DATEADD(dd, 6 - DATEPART(day, getdate()), getdate())), 0)        
    

    编辑: 没错,乔,它不会将它添加到第 0 天,它会将 0(天)添加到基本上只是将其转换回日期时间的天数。

    【讨论】:

    • Dateadd(interval, number, date) ... 所以本质上你是在向这个...添加 0 ... cast(datediff(dd, 0, [yourdate]) as datetime)
    【解决方案4】:

    我们可以使用这个方法:

    CONVERT(VARCHAR(10), GETDATE(), 120)
    

    最后一个参数将格式更改为仅以特定格式获取时间或日期。

    【讨论】:

      【解决方案5】:

      这可能不像单线那样流畅,但我主要用它来执行日期操作:

      DECLARE @Date datetime
      SET @Date = GETDATE()
      
      -- Set all time components to zero
      SET @Date = DATEADD(ms, -DATEPART(ms, @Date), @Date) -- milliseconds = 0
      SET @Date = DATEADD(ss, -DATEPART(ss, @Date), @Date) -- seconds = 0
      SET @Date = DATEADD(mi, -DATEPART(mi, @Date), @Date) -- minutes = 0
      SET @Date = DATEADD(hh, -DATEPART(hh, @Date), @Date) -- hours = 0
      
      -- Extra manipulation for month and year
      SET @Date = DATEADD(dd, -DATEPART(dd, @Date) + 1, @Date) -- day = 1
      SET @Date = DATEADD(mm, -DATEPART(mm, @Date) + 1, @Date) -- month = 1
      

      我用它来获取用于报告和绩效指标等的每小时、每天、每月和每年的日期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-04
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-26
        相关资源
        最近更新 更多