Sql server sql日期行为

Sql server sql日期行为,sql-server,datetime,Sql Server,Datetime,我注意到将字符串转换为日期和日期时间格式时出现了一些奇怪的行为。。。见下文: select datename(M,'2016-02-04') select datename(M,'2016-02-04 14:42:26') SELECT datename(M,Cast('2016-02-04' as Date)) SELECT datename(M,CAST('2016-02-04 14:42:26' as DateTime)) SELECT Cast('2016-02-04' as Dat

我注意到将字符串转换为日期和日期时间格式时出现了一些奇怪的行为。。。见下文:

select datename(M,'2016-02-04')
select datename(M,'2016-02-04 14:42:26')

SELECT datename(M,Cast('2016-02-04' as Date))
SELECT datename(M,CAST('2016-02-04 14:42:26' as DateTime))

SELECT Cast('2016-02-04' as Date)
SELECT CAST('2016-02-04 14:42:26' as DateTime)
SELECT CAST('2016-02-04 14:42:26' as SmallDateTime)
SELECT CONVERT(DateTime,'2016-02-04 14:42:26')
结果:

February
February
February
April
2016-02-04
2016-04-02 14:42:26.000
2016-04-02 14:42:26.000
有人能解释为什么它将日期时间值转换为美国格式而不是默认的英国格式吗?我再次明确地将日期格式设置为ymd,然后它就可以正常工作了???有什么想法吗

 select * 
 from sys.syslanguages  
 where Name = @@LANGUAGE
以Trassposed格式输出上述查询,以便更好地查看

+-------------+------------------------------------------------------------+
|   langid    | 23                                                         |
| dateformat  | dmy                                                        |
| datefirst   | 1                                                          |
| upgrade     | 0                                                          |
| name        | British                                                    |
| alias       | British English                                            |
| months      | January,February,March,April,May,June,July,                |
|             | August,September,October,November,December                 |
| shortmonths | Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec            |
| days        | Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday   |
| lcid        | 2057                                                       |
| msglangid   | 1033                                                       |
+-------------+------------------------------------------------------------+
请尝试YYMMDD

select
  a = datename(M,'20160204')
, b = datename(M,'20160204 14:42:26')

, c= datename(M,Cast('20160204' as Date))
, d = datename(M,CAST('20160204 14:42:26' as DateTime))

, e = Cast('20160204' as Date)
, f = CAST('20160204 14:42:26' as DateTime)
, g = CAST('20160204 14:42:26' as SmallDateTime)
, h = CONVERT(DateTime,'20160204 14:42:26')
这是SQL Server中所有日期样式中最安全的。 YYYY-DD-MM确实存在(该死),它可能会被YYYY-MM-DD弄糊涂


如果包含样式编号,则另一件事是使用CONVERT(数据类型、值、样式编号),例如CONVERT(日期,'2016-02-04 04:05:06.007',121)然后转换就知道了YYYY-MM-DD日期部分的顺序。

您的问题与此有一定关系,因此,请稍后查看它是否可以帮助您解决问题。这就是为什么我从不使用依赖区域性的格式。。。我在这里发布了一些保存选项:检查适当的区域设置中性格式。使用
YYYYMMDD[hh:mm:ss[.mmm]]
YYYY-mm-DDThh:mm:ss[.mmm]
@StoneleighDev为什么要使用文本而不是日期类型?如果使用
date
datetime
字段和参数,可以避免所有转换问题。这比使用安全文本或使用scecific调用
PARSE
要好得多culture@Shnugo实际上,如果你能找到一个明确的重复问题,那么我们就不必一直重复相同的答案。YYYYMMDD不是“最安全的”,它是唯一的标准日期格式。所有其他的都是特定于文化的。唯一的标准日期时间格式是ISO8601,即
YYYY-MM-DDTHH:MM:ss.zzz
。不需要转换ISO8601格式,也不要忘记ODBC格式(按照我在上面评论中发布的链接),它们是我最喜欢的格式。我不认为你的是“最安全的”,因为裸体的日期可能会被误认为是数字…这很好,最后使用一个函数将月号转换为月名,这是另一种方式。