【发布时间】: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