【问题标题】:is there a better way of concatenating date type有没有更好的连接日期类型的方法
【发布时间】:2018-04-16 14:08:20
【问题描述】:

我的日期类型列的数据如下所示:

2011-07-01 00:00:00.000

我想从中得到类似的东西

2011-7-1

有我的方法,但可能会做得更好

SELECT CAST(YEAR(ModifiedDate) AS varchar(15)) + '-' + CAST(MONTH(ModifiedDate) AS varchar(15)) + '-' + CAST(DAY(ModifiedDate) AS varchar(15))
FROM Sales.SalesOrderDetail

【问题讨论】:

  • 什么版本的 SQL Server?从 2012 年开始,FORMAT 可用,这使得这(几乎)变得微不足道。
  • 你必须要有连字符吗?这将是斜杠 SELECT CONVERT(char(10), GetDate(),126)
  • 我在 2014 年工作,感谢您指出这一点。
  • 转换为date,而不是尝试操作本地化字符串。为什么要在需要 date 时创建字符串?
  • 为什么不让客户以它认为合适的方式进行格式化?直接返回日期类型即可。

标签: sql-server tsql date datetime


【解决方案1】:

每条评论反馈和参考:https://sqlperformance.com/2015/06/t-sql-queries/format-is-nice-and-all-but

此 CAST 是 ANSI 标准 vs CONVERT

SELECT CAST(GetDate() as DATE)

为什么不使用 FORMAT,一般应该留给 UI 来做

为什么不使用 CONVERT(VARCHAR(10), @variable, 101)

【讨论】:

  • 为什么要转换为 本地化字符串 然后将其解析回日期,而不是简单地将 datetime 转换为 date ?如果用户修改DATEFORMAT设置,双重转换将失败
  • 我调整了来自 cmets 的内容
  • 返回“2011-07-01”。不是 OP 要求的。
  • @paparazzo “有我的方式,但可能可以做得更好”,保持日期数据类型是一个巨大的性能优势,所以我确信拥有 0 对他来说并不像他问的那么重要咨询。猜猜这里没有人收到饼干
  • @MichaelEvanchik 再次选择对性能影响不大。他们仍然可以在 where 和 join 的日期时间上操作。你确定格式对他不重要吗?
【解决方案2】:

您可以使用FORMATCASTCONVERT

这将返回为不同文化格式化的日期部分:

DECLARE @ft DATETIME = '2011-07-01 00:00:00.000'
SELECT FORMAT(@FT, 'd', 'en-us')

结果:7/11/2011

DECLARE @ft DATETIME = '2011-07-01 00:00:00.000'
SELECT FORMAT(@ft, 'yyyy-M-d')

结果:2011-7-11

有关格式的更多信息:https://docs.microsoft.com/en-us/sql/t-sql/functions/format-transact-sql?view=sql-server-2017

这将返回你的日期部分:

DECLARE @ft DATETIME = '2011-07-01 00:00:00.000'
SELECT CAST(@FT as date)

结果:2011-07-11

这为您提供了更多不同格式的选项:

DECLARE @ft DATETIME = '2011-07-01 00:00:00.000'
SELECT CONVERT(VARCHAR(10), @ft, 101)

结果:2011-07-01

除了变量,你也可以使用文本:

SELECT CONVERT(VARCHAR(10), '2011-07-01 00:00:00.000', 101)

结果:2011-07-01

更多关于 CAST 和 CONVERT 的信息:https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-2017

【讨论】:

  • 当 OP 询问如何从 datetime 生成 date 时,为什么要使用本地化字符串操作?只需投到date。这不是吹毛求疵。在WHERE 语句中,即使有索引,字符串操作也会导致全表扫描。 SQL Server 虽然识别 cast(somedatetime as date) 并将其替换为可以利用索引的范围搜索
  • @PanagiotisKanavos,OP 询问如何从日期时间获取 '2011-7-1',以上是几个选项。 OP 可以选择要使用的任何内容。并且,有一个选项 'CAST (SELECT CAST(@FT as date))
  • 只有一个选项返回'2011-7-1'
【解决方案3】:

您可以使用FORMAT 来执行此操作。

DECLARE @DATE DATETIME
SET @DATE = '2011-07-01 00:00:00.000'
SELECT FORMAT(@DATE, 'yyyy-M-d')
Result: 2011-7-1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多