代码之家  ›  专栏  ›  技术社区  ›  Eddie Groves

如何仅返回SQL Server日期时间数据类型中的日期

  •  1543
  • Eddie Groves  · 技术社区  · 16 年前
    SELECT GETDATE()
    

    返回: 2008-09-22 15:24:13.790

    我想要没有时间部分的约会部分: 2008-09-22 00:00:00.000

    我怎么能得到?

    38 回复  |  直到 6 年前
        1
  •  2223
  •   DineshDB    6 年前

    SQL Server 2008 再高一点,你应该 CONVERT 迄今为止:

    SELECT CONVERT(date, getdate())
    

    在旧版本上,可以执行以下操作:

    SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
    

    例如

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

    给我

    2008-09-22 00:00:00.000
    

    赞成的意见:

    • varchar &; datetime 需要转换
    • 不需要考虑 locale
        2
  •  678
  •   BenR    8 年前

    SQLServer2008现在有一个“日期”数据类型,它只包含一个没有时间组件的日期。任何使用SQLServer 2008及更高版本的用户都可以执行以下操作:

    SELECT CONVERT(date, GETDATE())
    
        3
  •  153
  •   abatishchev Karl Johan    8 年前

    如果使用SQL 2008及更高版本:

    select cast(getdate() as date)
    
        4
  •  70
  •   community wiki 10 revs, 5 users 74% Ricardo C    7 年前

    dateadd和datediff比转换为varchar更好。两个查询具有相同的执行计划,但执行计划主要涉及 数据 访问策略并不总是显示执行所有部件所花费的CPU时间所涉及的隐含成本。如果两个查询都是针对一个有数百万行的表运行的,那么使用datediff的CPU时间可以接近转换CPU时间的1/3!

    要查看查询的执行计划,请执行以下操作:

    set showplan_text on
    GO 
    

    dateadd和datediff都将执行convert_隐式。

    虽然转换解决方案对某些人来说更简单、更容易阅读,但是 更慢的。不需要强制转换回datetime(这是由服务器隐式完成的)。在datediff方法中,也不需要在后面使用dateadd,因为整数结果也将隐式转换回datetime。


    选择convert(varchar,mydate,101)from datestab

      |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(varchar(30),[TEST].[dbo].[DatesTable].[MyDate],101)))
           |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))
    

    从datestab中选择dateadd(dd,0,datediff(dd,0,mydate))。

      |--Compute Scalar(DEFINE:([Expr1004]=dateadd(day,(0),CONVERT_IMPLICIT(datetime,datediff(day,'1900-01-01 00:00:00.000',CONVERT_IMPLICIT(datetime,[TEST].[dbo].[DatesTable].[MyDate],0)),0))))
           |--Table Scan(OBJECT:([TEST].[dbo].[DatesTable]))
    

    按@digi recommended使用floor()的性能更接近于datediff,但不建议将datetime数据类型强制转换为float,而back并不总是生成原始值。

    记住伙计们:不要相信任何人。查看性能统计数据,然后自己测试它!

    测试结果时要小心。选择多行到客户机将隐藏性能差异,因为通过网络发送行比执行计算花费的时间更长。因此,请确保所有行的工作都由服务器完成,但没有发送到客户机的行集。

    对于某些人来说,关于缓存优化何时影响查询似乎有些困惑。在同一批或不同批中运行两个查询对缓存没有影响。因此,您可以手动终止缓存,也可以简单地来回运行查询多次。对查询2的任何优化也会影响任何后续查询,因此如果愿意,可以抛出执行1。

    这里是 full test script and performance results 这证明了datediff比转换为varchar快得多。

        5
  •  41
  •   Vladimir Vagaytsev    6 年前

    试试这个:

    SELECT CONVERT(VARCHAR(10),GETDATE(),111)
    

    上面的语句将当前格式转换为 YYYY/MM/DD ,请参阅 this link 选择您喜欢的格式。

        6
  •  37
  •   abatishchev Karl Johan    14 年前
    SELECT CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))
    
        7
  •  19
  •   ughai    9 年前

    你可以使用 CONVERT 函数只返回日期。请参见下面的链接:

    Date and Time Manipulation in SQL Server 2000

    CAST and CONVERT

    使用convert函数的语法是:

    CONVERT ( data_type [ ( length ) ] , expression [ , style ] ) 
    
        8
  •  17
  •   Mahesh ML    10 年前

    以日期格式返回

    强制转换(订单日期为日期)

    上述代码将在SQL Server 2010中工作。

    它会像2013年12月12日一样回来

    对于SQL Server 2012,请使用以下代码

    CONVERT(VARCHAR(10), OrderDate , 111)
    
        9
  •  13
  •   DiGi    16 年前

    使用floor()-只需切割时间部分。

    SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) AS DATETIME)
    
        10
  •  12
  •   MDM    8 年前
    SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),103) --21/09/2011
    
    SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),101) --09/21/2011
    
    SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),111) --2011/09/21
    
    SELECT CONVERT(VARCHAR,DATEADD(DAY,-1,GETDATE()),107) --Sep 21, 2011
    
        11
  •  11
  •   Focusyn    12 年前

    如果要使用convert并获得与提出的原始问题相同的输出,即,yyyy-mm-dd,则使用 CONVERT(varchar(10),[SourceDate as dateTime],121) 与前面两个答案的代码相同,但要用破折号转换为YYYY-MM-DD的代码是121。

    如果我能在肥皂盒上呆一会儿, 这种格式不属于数据层 这就是为什么在引入实际的日期部分数据类型之前,没有愚蠢的高开销“技巧”是不可能的。在数据层中进行这样的转换是对DBMS的巨大开销,但更重要的是,当您这样做时,基本上已经在内存中创建了孤立的数据,我认为您将返回到程序。您不能将它放回另一个3nf+列中,或者在不进行恢复的情况下将其与任何类型的列进行比较,因此您所做的只是引入故障点并删除关系引用。

    您应该始终继续并将日期时间数据类型返回到调用程序,并且 在表示层中,进行任何必要的调整。 在将它们返回给调用者之前,一旦转换了它们,应用程序就不再希望引用完整性了。这将再次阻止更新或删除操作,除非您执行某种手动恢复操作,当不需要时,这会再次将您的数据暴露于human/code/gremlin错误中。

        12
  •  10
  •   chancrovsky profesor79    8 年前
    SELECT DATEADD(DD, DATEDIFF(DD, 0, GETDATE()), 0)
    
    SELECT DATEADD(DAY, 0, DATEDIFF(DAY,0, GETDATE()))
    
    SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 101))
    

    编辑:前两个方法基本相同,out执行convert to varchar方法。

        13
  •  9
  •   chancrovsky profesor79    8 年前

    为了获得指示的结果,我使用以下命令。

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

    我觉得它很有用。

        14
  •  9
  •   chancrovsky profesor79    8 年前

    如果需要varchar数据类型的结果,您应该

    SELECT CONVERT(DATE, GETDATE()) --2014-03-26
    SELECT CONVERT(VARCHAR(10), GETDATE(), 111) --2014/03/26
    

    上面已经提到了

    如果您需要日期和时间格式的结果,您应该通过下面的任何查询

    1) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 111)) 仅限日期2014-03-26 00:00:00.000

    2) SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10), GETDATE(), 112)) 仅限日期2014-03-26 00:00:00.000

    3)

     DECLARE  @OnlyDate DATETIME
       SET @OnlyDate = DATEDIFF(DD, 0, GETDATE())
       SELECT @OnlyDate AS OnlyDate
    

    --2014年3月26日00:00:00.000

        15
  •  9
  •   Somnath Muluk    8 年前

    如果您正在使用 SQL Server 2012或更高版本 ,

    使用 Format() 功能。

    SQL Server已经有多个答案和格式类型。 但大多数方法都有点含糊不清,您很难记住格式类型或函数相对于特定日期格式的数字。这就是为什么在下一个版本的SQL Server中有更好的选择。

    FORMAT ( value, format [, culture ] )
    

    区域性选项非常有用,因为您可以根据查看者指定日期。

    你必须记住d(小图案)和d(长图案)。

    1.“D”-短日期模式。

    2009-06-15T13:45:30 -> 6/15/2009 (en-US)
    2009-06-15T13:45:30 -> 15/06/2009 (fr-FR)
    2009-06-15T13:45:30 -> 2009/06/15 (ja-JP)
    

    2.“D”-长日期模式。

    2009-06-15T13:45:30 -> Monday, June 15, 2009 (en-US)
    2009-06-15T13:45:30 -> 15 июня 2009 г. (ru-RU)
    2009-06-15T13:45:30 -> Montag, 15. Juni 2009 (de-DE)
    

    查询中的更多示例。

    DECLARE @d DATETIME = '10/01/2011';
    SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
          ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
          ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
          ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'; 
    
    SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'
          ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
          ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
          ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';
    
    US English Result Great Britain English Result  German Result Simplified Chinese (PRC) Result
    ----------------  ----------------------------- ------------- -------------------------------------
    10/1/2011         01/10/2011                    01.10.2011    2011/10/1
    
    US English Result            Great Britain English Result  German Result                    Chinese (Simplified PRC) Result
    ---------------------------- ----------------------------- -----------------------------  ---------------------------------------
    Saturday, October 01, 2011   01 October 2011               Samstag, 1. Oktober 2011        2011年10月1日
    

    如果需要更多格式,可以转到:

    1. Standard Date and Time Format Strings
    2. Custom Date and Time Format Strings
        16
  •  8
  •   Imran Ali Khan    9 年前
     Convert(nvarchar(10), getdate(), 101) --->  5/12/14
    
     Convert(nvarchar(12), getdate(), 101) --->  5/12/2014
    
        17
  •  7
  •   Art Schmidt    7 年前

    如果要将结果分配给列或变量,请为其指定日期类型,并且转换是隐式的。

    DECLARE @Date DATE = GETDATE()   
    
    SELECT @Date   --> 2017-05-03
    
        18
  •  6
  •   Radim Köhler user2134822    11 年前

    我认为这在你的情况下是可行的:

    CONVERT(VARCHAR(10),Person.DateOfBirth,111) AS BirthDate
    //here date is obtained as 1990/09/25
    
        19
  •  6
  •   Krishnraj Rana    8 年前

    好吧,尽管我有点晚了:)这是另一个解决办法。

    SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) as DATETIME)
    

    结果

    2008-09-22 00:00:00.000
    

    如果您使用的是SQL Server 2012及更高版本,则可以使用 FORMAT() 像这样的功能-

    SELECT FORMAT(GETDATE(), 'yyyy-MM-dd')
    
        20
  •  5
  •   tumultous_rooster    9 年前

    即使使用古老的MSSQLServer7.0,这里的代码 link )允许我获取当时所需的任何日期格式:

    PRINT '1) Date/time in format MON DD YYYY HH:MI AM (OR PM): ' + CONVERT(CHAR(19),GETDATE())  
    PRINT '2) Date/time in format MM-DD-YY: ' + CONVERT(CHAR(8),GETDATE(),10)  
    PRINT '3) Date/time in format MM-DD-YYYY: ' + CONVERT(CHAR(10),GETDATE(),110) 
    PRINT '4) Date/time in format DD MON YYYY: ' + CONVERT(CHAR(11),GETDATE(),106)
    PRINT '5) Date/time in format DD MON YY: ' + CONVERT(CHAR(9),GETDATE(),6) 
    PRINT '6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): ' + CONVERT(CHAR(24),GETDATE(),113)
    

    它产生了这个输出:

    1) Date/time in format MON DD YYYY HH:MI AM (OR PM): Feb 27 2015  1:14PM
    2) Date/time in format MM-DD-YY: 02-27-15
    3) Date/time in format MM-DD-YYYY: 02-27-2015
    4) Date/time in format DD MON YYYY: 27 Feb 2015
    5) Date/time in format DD MON YY: 27 Feb 15
    6) Date/time in format DD MON YYYY HH:MM:SS:MMM(24H): 27 Feb 2015 13:14:46:630
    
        21
  •  5
  •   chancrovsky profesor79    8 年前
    DECLARE @yourdate DATETIME = '11/1/2014 12:25pm'    
    SELECT CONVERT(DATE, @yourdate)
    
        22
  •  4
  •   chancrovsky profesor79    8 年前

    我赞成以下未提及的内容:

    DATEFROMPARTS(DATEPART(yyyy, @mydatetime), DATEPART(mm, @mydatetime), DATEPART(dd, @mydatetime))
    

    它也不关心本地或进行双重转换——尽管每个“日期部分”可能都进行数学运算。因此,它可能比datediff方法慢一点,但对我来说,它更清楚。尤其是当我只想按年份和月份分组时(将日期设置为1)。

        23
  •  4
  •   Kris Khairallah    8 年前

    戴特:

    SELECT CONVERT(date, GETDATE())
    SELECT CAST(GETDATE() as date)
    

    时间:

    SELECT CONVERT(time , GETDATE() , 114)
    SELECT CAST(GETDATE() as time)
    
        24
  •  4
  •   xbb    8 年前

    从SQL Server 2012开始,可以执行以下操作:

    SELECT FORMAT(GETDATE(), 'yyyy-MM-dd 00:00:00.000')

        25
  •  4
  •   Jonathan Leffler    7 年前

    在SQL Server 2000上

    CAST(
    (
        STR( YEAR( GETDATE() ) ) + '/' +
        STR( MONTH( GETDATE() ) ) + '/' +
        STR( DAY( GETDATE() ) )
    )
    AS DATETIME)
    
        26
  •  3
  •   Janaka R Rajapaksha    10 年前

    为什么不使用日期格式(您的“日期”列,“%d-%m-%y”)?

    前任: select DATE_FORMAT( some_datetime_column, '%d-%m-%Y' ) from table_name

    您可以通过重新安排来更改m、d和year的顺序 '%d-%m-%Y' 部分

        27
  •  3
  •   chancrovsky profesor79    8 年前

    这是所有答案中缺失的,可能不是最有效的,但很容易写和理解,不需要样式,没有复杂的日期函数。

    SELECT CONVERT(DATETIME,CONVERT(DATE,((GETDATE()))))
    
        28
  •  3
  •   Eric Aya    7 年前

    简单来说,你可以这样做:

    SELECT CONVERT(date, getdate())
    SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @your_date))
    SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
    

    输出为:

    2008-09-22 00:00:00.000
    

    或者简单地这样做:

    SELECT CONVERT (DATE, GETDATE()) 'Date Part Only'
    

    结果:

    Date Part Only
    --------------
    2013-07-14
    
        29
  •  2
  •   Popo    10 年前

    日期部分和日期格式可以使用以下内容:

    datename=>返回表示指定日期的指定日期部分的字符串

    日期添加=> DATEPART() 函数用于返回日期/时间的单个部分,如年、月、日、小时、分钟等。

    datepart=>返回表示指定日期的指定日期部分的整数。

    CONVERT() = 转换() 函数是将一种数据类型的表达式转换为另一种数据类型的通用函数。 这个 转换() 函数可用于以不同格式显示日期/时间数据。

        30
  •  2
  •   Surekha    9 年前

    日期(日期和时间字段) 日期格式(日期和时间,'%y-%m-%d') 两个回报 只有日期 开始日期和时间