这不是问如何在MSSQL中将任意字符串转换为日期时间,例如这个问题.
我可以控制字符串格式,但我想知道使用日期字符串更新日期时间字段的MSSQL语法.
可能重复:
转换和验证日期字符串的最佳方法
在SQL Server中为datetime变量分配日期时间值时,哪种格式最适合用于文化无关的原因以及为什么?
下面的日期是2013年12月1日
DECLARE @myDate DATETIME
SET @myDate = '2013-12-01'
SET @myDate = '20131201'
SET @myDate = '12/01/2013'
SET @myDate = '2013-12-01T00:00:00.000'
SET @myDate = '2013-12-01T00:00:00'
Run Code Online (Sandbox Code Playgroud)
如果@myDate是类型DATETIME2,你的答案会不同吗?
我试图使用CASE表达式创建一个持久的计算列:
ALTER TABLE dbo.Calendar ADD PreviousDate AS
case WHEN [Date]>'20100101' THEN [Date]
ELSE NULL
END PERSISTED
Run Code Online (Sandbox Code Playgroud)
MSDN清楚地说CASE是确定性的,在这里
但是,我收到一个错误:
消息4936,级别16,状态1,行1"表日历"中的计算列"PreviousDate"无法保留,因为该列是非确定性的.
当然,我可以创建一个标量UDF并明确声明它是确定性的,但是有更简单的方法吗?我已经在获取最新的服务包了.谢谢.
sql sql-server calculated-columns sql-server-2008 persisted-column
这本来是一个关于如何实现这个问题的问题,因为我被困在某一部分,但我现在很好奇为什么这首先发生了.如果时间没有差别,我只需要比较日期而不是时间,这不是问题.下面的代码显示了我最初尝试的查询
SELECT *
FROM Employee e
inner join OT_Hours o on o.Emp_ID=e.Emp_ID
inner join Position p on p.Position_ID=e.Position_ID
inner join Signup_Sheet s on s.Employee_ID=e.Emp_ID
WHERE e.Eligible_OT=1 and s.Day_Shift = 1
and p.Position_Name = 'Controller'
and Convert(Varchar(20),s.Date,101) = '07/26/2010'
and Convert(Varchar(20),o.Date,101) <='07/26/2010'
and Convert(Varchar(20),o.Date,101) > '07/26/2009'
and o.Quantity NOT IN(0.3) order by o.Date DESC
Run Code Online (Sandbox Code Playgroud)
当我运行该查询时,我没有得到任何结果,但当我删除第二行后,它将返回12个结果(<=),当我删除第3个最后一行但保留第二个最后一行时,它将返回6个结果(>).在查看数据后,我可以看到应该返回其中4个结果.现在为了奇怪的部分.以下是我目前使用的代码.
SELECT DISTINCT o.Date, e.Emp_ID as Emp_ID, e.First_Name+ ' ' +e.Last_Name as Name, o.Quantity as Sum
FROM Employee e
left join OT_Hours o on o.Emp_ID=e.Emp_ID
left join …Run Code Online (Sandbox Code Playgroud) 我在这里非常沮丧,已经尝试了好几天...我想要的只是德国用户能够输入应该存储在SQL Server中的日期.日期采用以下格式"dd.mm.yyyy".我总是收到类似这样的错误消息:查询表达式'#23.01.2004 00:07:00#'中的日期语法错误. - 暂时使用Access.
我已经尝试了很多方法(Thread.CultureInfo,CDate(),Formatting DateTimeStyles)但这里是我最新的:
Dim dTermin As DateTime
dTermin = DateTime.Parse(txtTermin.Text)
sSQL = "INSERT INTO Termin (Termin) VALUES ("
sSQL = sSQL & "#" & dTermin & "#)"
Run Code Online (Sandbox Code Playgroud)
这也给了我一个错误.如果我硬编码像"10-04-2004"这样的日期,那么它的确有效.它是一个Access 2000 db,有两个字段:ID(自动编号)和终端(ShortDate).使用Jet OLEDB 4.0 Provider.
SQL Server 2005:
以下观点
SELECT CONVERT(VARCHAR(20), keyedtimestamp, 101) as KeyedDate
FROM TMSSTATFILE_STATS a
WHERE (CONVERT(VARCHAR(20), a.KeyedTimestamp, 101) BETWEEN '03/01/2011' And '03/31/2011')
ORDER BY KeyedDate
Run Code Online (Sandbox Code Playgroud)
截止日期为2011年3月2日至2011年3月31日.
如果我将第一个日期更改为03/00/2011
SELECT CONVERT(VARCHAR(20), keyedtimestamp, 101) as KeyedDate
FROM TMSSTATFILE_STATS a
WHERE (CONVERT(VARCHAR(20), a.KeyedTimestamp, 101) BETWEEN '03/00/2011' And '03/31/2011')
ORDER BY KeyedDate
Run Code Online (Sandbox Code Playgroud)
它现在提供2011年3月1日至2011年3月31日的数据
KeyedTimestamp字段是DateTime,并且有时间与这些记录相关联.2011年3月31日的所有记录都已计算在内.我知道我可以通过在第二个日期之间提供最大时间来实现这一点,所以我不是在寻找替代where子句,而是要理解为什么它忽略了第一个的记录,即使它合并了从31日开始.
它几乎就像它在3月1日23:59:59检查,我希望我可以消除这种检查,我只关心日期,而不是时间
我正在为datetime寻找一个确定性截断函数,这个函数完成了这项工作:
DATEADD(dd, DATEDIFF(dd, 0, @date), 0)
Run Code Online (Sandbox Code Playgroud)
但这应该是持久计算列的输入,它将成为主键的一部分,因此它必须是不可为空的.所以我做了这个:
ISNULL(DATEADD(dd, DATEDIFF(dd, 0, @date), 0), '01.01.1900')
Run Code Online (Sandbox Code Playgroud)
但现在表达变得不确定了.任何人都可以告诉我为什么,以及如何让它确定性?
谢谢!
我有一个PHP脚本通过SQL将值插入SQL Server 2005表
$date = '15 Jun 2011 00:00';
$sql = "INSERT INTO shows ( DateStart ) VALUES ( '$date')";
Run Code Online (Sandbox Code Playgroud)
我有2个问题:
1)如何最好地将此日期转换为SQL Server可以理解的内容?我的系统上的默认格式是mm/dd/yyyy,但我想将日期显示为用户可读.
2)插入空字符串时,DateStart值设置为1/1/1900.如何最好地将"无效"日期转换为NULL(该列已经接受NULL),以便在$date = ""那时DateStart IS NULL
谢谢!
我有一个大文本文件(超过3亿条记录).有一个字段包含YYYYMM格式的日期.目标字段是日期类型,我正在使用MS SQL 2008 R2服务器.由于数据量巨大,我更喜欢使用批量插入.这是我已经做过的事情:
bulk insert Tabela_5
from 'c:\users\...\table5.csv'
with
(
rowterminator = '\n',
fieldterminator = ',',
tablock
)
select * from Tabela_5
Run Code Online (Sandbox Code Playgroud)
201206在文件中原来是2020-12-06在服务器上,而我希望它2012-06-01(我不关心这一天).有没有办法将这种格式的日期批量插入日期类型的字段?
亲切的问候maciej pitucha
我有一个char(8)字段,它should确实包含yyyymmdd dateformat中的值.鉴于(假设的)表格,id(int)|datestring(char(8))我希望能够做类似的事情
SELECT id, isValidDate(datestring) FROM my_hypothetical_table
Run Code Online (Sandbox Code Playgroud)
对我来说这很重要,因为它可以像查询一样运行(例如,我可以SELECT * from othertable INNER JOIN hypothetical_table on hypothetical_table.id = othertable.hypothetical_FK WHERE isValidDate(hypothetical_table.datestring) = 1).捕获错误似乎不可行.
请注意,IsDate()函数仅适用于斜杠分隔日期,而不适用于yyyymmdd格式.