【问题标题】:SQL - temporarily set default date when parsing time as datetime in SSMSSQL - 在 SSMS 中将时间解析为日期时间时临时设置默认日期
【发布时间】:2019-12-25 15:04:29
【问题描述】:

如果我这样做

SELECT CAST('11:30 pm' AS datetime)

我得到 1900-01-01 23:30:00.000

但如果我这样做了

SELECT PARSE('11:30 PM' AS datetime using 'en-gb')

我得到 2019-08-20 23:30:00.000

即parse 给出今天的日期。

是否可以将解析时间值给出的默认日期修改为 1900-01-01(类似于 cast)?

我想要这个的原因是因为我正在遍历大量列并想确定它们是否应该设置为日期、时间或日期时间,所以如果日期时间列中的每个日期都是 1900-01- 01 我可以确定我需要将其转换为时间列(因为我永远不会处理日期 1900-01-01)但有可能列中的所有日期都设置为今天的日期,我应该'不会删除列的日期部分。

例如,一列可以是:

11:01
11:30
11:40

但另一列可能是

20-08-2019 11:00
20-08-2019 11:05
20-08-2019 11:10

我想对两列运行相同的过程,以使它们具有正确的格式。 因此,第一列应保留为时间列,第二列应保留为日期时间列。

正如我所说的,我有几列,所以我不想手动查看每一列以确定它应该是日期时间还是时间,但如果我可以在解析时将日期设置为 1900-01-01 time to datetime (类似于 cast) 我将能够看到哪些列应该删除日期部分。

我有类似的处理日期时间的东西,其中时间部分应该被删除:我只需检查是否存在至少一个不是 00:00 的时间,如果不存在,我会将其转换为日期。

我需要使用 PARSE,因为我不确定日期的格式,而且 PARSE 比 CONVERT 或 CAST 灵活得多(根据我的经验)。

【问题讨论】:

  • "我需要使用 PARSE,因为我不确定日期的格式" 您希望如何解释以下字符串? 01-02-2019 10:23:30?我可以想到至少 4 个可以将此字符串转换为的不同日期时间值,它们都没有任何优先级。那么它会是什么 - 上午 10 点或晚上 10 点? 1 月 2 日还是 2 月 1 日?
  • 我会先使用 en-gb 将列解析为 datetime,然后使用 en-us,如果两者都成功,则无法确定它应该是 us 还是 uk 日期格式,所以我不会转换列。我有必要的步骤来阻止这种情况发生唯一的问题是当我将时间解析为日期时间时
  • 不过,我们或英国并没有改变 10:23:30 可以是上午 10 点或晚上 10 点这一事实。
  • 那么,您将日期/时间存储在 varchar 类型的列中,并且想要解决这个问题?另外,请注意 PARSE 比 CAST/CONVERT 慢得多。

标签: sql sql-server tsql date type-conversion


【解决方案1】:

正如我所见,这可能是不可能的,因为 PARSE() 使用 .NETDateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeUniversal 作为固定设置进行日期和/或时间解析。

在使用 CAST 或 CONVERT 时,您可以使用 SET LANGUAGE 设置特定的语言/文化。

【讨论】:

    【解决方案2】:

    我不知道你为什么想要一个 1900 的 datetime 值,但你可以使用:

    select convert(datetime, PARSE('11:30 PM' AS time using 'en-gb'))
    

    我会满足于time 值:

    select PARSE('11:30 PM' AS time using 'en-gb')
    

    【讨论】:

    • 谢谢,但不幸的是这对我没有帮助。晚上 11:30 只是一个例子。可能还有另一列的值为“2011-10-10 11:30”,在这种情况下,我不想删除日期部分,但如果日期时间列中的每个日期都是 1900-01-01 我'会知道将日期时间列转换为时间是安全的
    • @Anonymous 。 . .我建议您提出一个 问题,其中包含清晰的样本数据和所需的结果。这回答了这里提出的问题。
    【解决方案3】:

    如果您只是在寻找值 '1900-01-01' 作为输出,您可以简单地转换为如下日期-

    SELECT CAST('11:30 pm' AS date)
    

    输出是-

    1900-01-01
    

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 2012-12-07
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多