【问题标题】:How to select date without time in SQL如何在 SQL 中选择没有时间的日期
【发布时间】:2011-07-04 18:43:34
【问题描述】:

当我在 SQL 中选择日期时,它返回为 2011-02-25 21:17:33.933。但我只需要日期部分,即2011-02-25。我该怎么做?

【问题讨论】:

标签: sql sql-server sql-server-2005


【解决方案1】:

【讨论】:

  • 本页最优雅的答案。
  • 当您将 GETDATE() 替换为 DATETIME2 类型的值时,这不起作用。
【解决方案2】:

最快的是datediff,例如

select dateadd(d, datediff(d,0, [datecolumn]), 0), other..
from tbl

但如果你只需要使用值,那么你可以跳过dateadd,例如

select ...
WHERE somedate <= datediff(d, 0, getdate())

表达式datediff(d, 0, getdate()) 足以返回没有时间部分的今天日期。

【讨论】:

  • Oldie but goodie,在较旧的 2000/2005 数据库中使用了这个技巧数十次。
【解决方案3】:

我猜他想要一个字符串。

select convert(varchar(10), '2011-02-25 21:17:33.933', 120)

这里的120告诉转换函数我们在following format中传递输入日期:yyyy-mm-dd hh:mi:ss

【讨论】:

  • 120 有什么用?
  • @Павле 参考这篇文章Date and Time styles
  • 我使用了这个 select convert(varchar(10), APPROVED_DATE, 120) ,我得到了错误列 APPROVED_DATE datetime ,我将如何转换它?错误无法绑定多部分标识符“LAB_RESULTS.APPROVED_DATE”。
  • 只要您不打算将其放入群组功能并尝试按日期订购,它就可以正常工作。 Prad9 的答案会更好地解决这个问题
【解决方案4】:

对于 SQL Server 2008:

Convert(date, getdate())  

请参考https://docs.microsoft.com/en-us/sql/t-sql/functions/getdate-transact-sql

【讨论】:

  • 我得到“类型日期不是定义的系统类型。”
  • 我不知道为什么这是一个如此受欢迎的答案。此问题适用于 SQL Server 2005,NOT 2008。2005 没有 date 数据类型,因此将此解决方案视为无效。
  • 它被赞成是因为人们来寻找解决他们问题的方法,而不是作者。因此,如果 110 人发现这对他们有用,我认为它有 110 人支持是公平的。
  • 我在使用 select convert (table.order_date, getdate()) 时遇到同样的错误; sql server version 2017,报错(Type date is not a defined system type) the column type datetime
  • @zizzipupp 只需将文本 getdate() 替换为您要转换的任何列的实际名称
【解决方案5】:

你可以这样使用

SELECT Convert(varchar(10), GETDATE(),120) 

【讨论】:

  • 我将把列名订单日期放在哪里?
【解决方案6】:

有点晚了,不过使用ODBC“curdate”函数(尖括号'fn'是ODBC函数转义序列)。

SELECT {fn curdate()} 

输出:2013-02-01

【讨论】:

  • 我真的很好奇你认为你的答案比公认的答案更好。或者您可能指的是其他答案?
  • @Mikael Eriksson:嗯,因为 ODBC 函数是规范函数,因此是可索引的,这与非确定性 SQL-Server 函数不同。但没关系,当您从测试中的 3 个条目移动到生产中的 1 *10E6 条目时,这只是一个扩展问题,您在开发过程中不会遇到任何问题;)
  • 如果您运行此查询SELECT {fn curdate()} FROM (SELECT 1) AS T(X) 并查看实际执行计划(xml 版本),您将看到实际执行的是CONVERT(varchar(10),getdate(),23)。所以这个 ODBC 函数的数据类型是varchar(10),这意味着如果您想将结果与datetime 进行比较,您将在字符串yyyy-mm-dd 上获得从varchar(10)datetime 的隐式转换。该隐式转换将因set dateformat dmy 而失败。
  • @Mikael Eriksson:看起来像一个错误,他们应该使用 SELECT CONVERT(char(8), GETDATE(), 112) 代替。
  • “规范函数,因此是可索引的,与非确定性 SQL-Server 函数不同”——呃,什么?
【解决方案7】:

在PLSQL中你可以使用

to_char(SYSDATE,'dd/mm/yyyy')

【讨论】:

  • 考虑将此转移到评论中。
  • 这个问题是关于 SQL Server...而不是 Oracle
【解决方案8】:

使用对我有用的 CAST(GETDATE() as date),很简单。

【讨论】:

  • 我将在哪里添加我的列名? select cast(getdate() as date , order_date)?
  • @Abdullah CAST(order_date AS DATE)
  • learnsql.com/cookbook/…的文章中发现了相同的
【解决方案9】:

对于 2008 旧版本

SELECT DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)

【讨论】:

  • 为此鼓掌!其他解决方案仅依赖 varchar(10) 部分,它只是截断值。
【解决方案10】:

使用很简单:

convert(date, Btch_Time)

示例如下:

表:

Efft_d       Loan_I  Loan_Purp_Type_C   Orig_LTV    Curr_LTV    Schd_LTV    Un_drwn_Bal_a      Btch_Time            Strm_I  Btch_Ins_I
2014-05-31  200312500   HL03             NULL         1.0000    1.0000         1.0000      2014-06-17 11:10:57.330  1005    24851e0a-53983699-14b4-69109


Select * from helios.dbo.CBA_SRD_Loan where Loan_I in ('200312500') and convert(date, Btch_Time) = '2014-06-17'

【讨论】:

    【解决方案11】:

    首先将日期转换为浮点数(显示数字),然后将ROUND 数字转换为小数点 0,然后将其转换为日期时间。

    convert(datetime,round(convert(float,orderdate,101),0) ,101)
    

    【讨论】:

    • round 需要第三个参数“1”来截断而不是四舍五入,否则当时间超过中午时,它将被四舍五入到第二天。
    【解决方案12】:

    如果你想返回一个日期类型作为一个日期使用

    CONVERT(date, SYSDATETIME())
    

    SELECT CONVERT(date,SYSDATETIME()) 
    

    DECLARE @DateOnly Datetime
    SET @DateOnly=CONVERT(date,SYSDATETIME())
    

    【讨论】:

      【解决方案13】:

      试试这个。

      SELECT DATEADD(DD, 0, DATEDIFF(DD, 0, GETDATE()))
      

      【讨论】:

        【解决方案14】:

        你也可以试试这个。

        SELECT CONVERT(DATE, GETDATE(), 120)
        

        【讨论】:

          【解决方案15】:

          在转换为日期后将其转换回日期时间,以便在需要时保持相同的数据时间

          select Convert(datetime, Convert(date, getdate())  )
          

          【讨论】:

            【解决方案16】:

            如果您需要时间归零,例如2018-01-17 00:00:00.000

            SELECT CONVERT(DATETIME, CONVERT(DATE, GETDATE()), 121)

            【讨论】:

            • 谢谢,这正是我要找的。​​span>
            【解决方案17】:

            为时已晚,但关注对我很有效

            declare @vCurrentDate date=getutcdate()
            
            select @vCurrentDate
            

            当数据类型为日期时,小时数会被截断

            【讨论】:

              【解决方案18】:

              从表中选择日期(字段);

              字段值:2020-12-15 12:19:00

              选择值:2020-12-15

              【讨论】:

                【解决方案19】:

                我会使用DATEFROMPARTS 函数。这很容易,你不需要铸造。例如这个查询:

                Select  DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), DAY(GETDATE())) as myNewDate
                

                会回来

                2021-01-21

                您还可以创建自己的日期,例如您想要一个月的第一天作为日期,而不是像下面这样使用:

                Select  DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1) as myNewDate
                

                结果将是:

                2021-01-01

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2016-07-18
                  • 1970-01-01
                  • 2014-06-01
                  • 2012-10-18
                  • 2014-08-09
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-02-21
                  相关资源
                  最近更新 更多